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 9843fb82954 Support range type constructor functions in PostgreSQL 
without quotes (#37994)
9843fb82954 is described below

commit 9843fb829543578a7b6961ff565c46b4b1c75c08
Author: Claire <[email protected]>
AuthorDate: Mon Feb 9 19:26:36 2026 +0800

    Support range type constructor functions in PostgreSQL without quotes 
(#37994)
    
    * support new function
    
    * support new function
---
 RELEASE-NOTES.md                                    |  1 +
 .../src/main/antlr4/imports/postgresql/BaseRule.g4  | 13 +++++++++++--
 .../statement/PostgreSQLStatementVisitor.java       | 11 +++++++++--
 .../internal/asserts/segment/owner/OwnerAssert.java |  4 ++++
 .../parser/src/main/resources/case/dml/select.xml   | 21 +++++++++++++++++++++
 .../src/main/resources/sql/supported/dml/select.xml |  1 +
 6 files changed, 47 insertions(+), 4 deletions(-)

diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 7d1c30cdca7..20384c86adf 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -11,6 +11,7 @@
 3. SQL Parser: Fix error parsing \l command SQL statement when front-end 
protocol is og - [#37953](https://github.com/apache/shardingsphere/pull/37953)
 4. SQL Parser:Fix SQLParsingException when using reserved word `order` in 
ORDER BY clause - [#37958](https://github.com/apache/shardingsphere/pull/37958)
 5. SQL Parser:Support '2'::int statement in PostgreSQL and openGauss - 
[#37962](https://github.com/apache/shardingsphere/pull/37962)
+6. SQL Parser:Support range type constructor functions in PostgreSQL without 
quotes - [#37994](https://github.com/apache/shardingsphere/pull/37994)
 
 ## Release 5.5.3
 
diff --git 
a/parser/sql/engine/dialect/postgresql/src/main/antlr4/imports/postgresql/BaseRule.g4
 
b/parser/sql/engine/dialect/postgresql/src/main/antlr4/imports/postgresql/BaseRule.g4
index f620a9a4265..58eadf2b900 100644
--- 
a/parser/sql/engine/dialect/postgresql/src/main/antlr4/imports/postgresql/BaseRule.g4
+++ 
b/parser/sql/engine/dialect/postgresql/src/main/antlr4/imports/postgresql/BaseRule.g4
@@ -935,7 +935,8 @@ funcApplication
     ;
 
 funcName
-    : typeFunctionName | colId indirection
+    : (owner DOT_)? typeFunctionName
+    | colId indirection
     ;
 
 aexprConst
@@ -967,7 +968,15 @@ channelName
     ;
 
 typeFunctionName
-    : identifier | unreservedWord | typeFuncNameKeyword
+    : identifier
+    | unreservedWord
+    | typeFuncNameKeyword
+    | INT4RANGE
+    | INT8RANGE
+    | NUMRANGE
+    | TSRANGE
+    | TSTZRANGE
+    | DATERANGE
     ;
 
 functionTable
diff --git 
a/parser/sql/engine/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/engine/postgresql/visitor/statement/PostgreSQLStatementVisitor.java
 
b/parser/sql/engine/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/engine/postgresql/visitor/statement/PostgreSQLStatementVisitor.java
index 2a686e88638..76014f3b6b2 100644
--- 
a/parser/sql/engine/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/engine/postgresql/visitor/statement/PostgreSQLStatementVisitor.java
+++ 
b/parser/sql/engine/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/engine/postgresql/visitor/statement/PostgreSQLStatementVisitor.java
@@ -254,12 +254,17 @@ public abstract class PostgreSQLStatementVisitor extends 
PostgreSQLStatementPars
         return visit(ctx.identifier());
     }
     
+    @Override
+    public final ASTNode visitOwner(final OwnerContext ctx) {
+        return new OwnerSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), (IdentifierValue) visit(ctx.identifier()));
+    }
+    
     @Override
     public final ASTNode visitTableName(final TableNameContext ctx) {
         SimpleTableSegment result = new SimpleTableSegment(new 
TableNameSegment(ctx.name().getStart().getStartIndex(), 
ctx.name().getStop().getStopIndex(), (IdentifierValue) visit(ctx.name())));
         OwnerContext owner = ctx.owner();
         if (null != owner) {
-            result.setOwner(new OwnerSegment(owner.getStart().getStartIndex(), 
owner.getStop().getStopIndex(), (IdentifierValue) visit(owner.identifier())));
+            result.setOwner((OwnerSegment) visit(owner));
         }
         return result;
     }
@@ -269,7 +274,7 @@ public abstract class PostgreSQLStatementVisitor extends 
PostgreSQLStatementPars
         ColumnSegment result = new 
ColumnSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), 
(IdentifierValue) visit(ctx.name()));
         OwnerContext owner = ctx.owner();
         if (null != owner) {
-            result.setOwner(new OwnerSegment(owner.getStart().getStartIndex(), 
owner.getStop().getStopIndex(), (IdentifierValue) visit(owner.identifier())));
+            result.setOwner((OwnerSegment) visit(owner));
         }
         return result;
     }
@@ -1252,6 +1257,8 @@ public abstract class PostgreSQLStatementVisitor extends 
PostgreSQLStatementPars
         FunctionSegment result = new 
FunctionSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), 
functionName, getOriginalText(ctx));
         if (null != funcNameContext.colId()) {
             result.setOwner(new 
OwnerSegment(funcNameContext.colId().start.getStartIndex(), 
funcNameContext.colId().stop.getStopIndex(), new 
IdentifierValue(funcNameContext.colId().getText())));
+        } else if (null != funcNameContext.owner() && null != 
funcNameContext.typeFunctionName()) {
+            result.setOwner((OwnerSegment) visit(funcNameContext.owner()));
         }
         result.getParameters().addAll(expressionSegments);
         return result;
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/owner/OwnerAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/owner/OwnerAssert.java
index b9840ba604f..7accb886d97 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/owner/OwnerAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/owner/OwnerAssert.java
@@ -42,6 +42,10 @@ public final class OwnerAssert {
      * @param expected expected owner
      */
     public static void assertIs(final SQLCaseAssertContext assertContext, 
final OwnerSegment actual, final ExpectedOwner expected) {
+        if (null == actual) {
+            assertTrue(null == expected, assertContext.getText("Actual owner 
should be null."));
+            return;
+        }
         IdentifierValueAssert.assertIs(assertContext, actual.getIdentifier(), 
expected, "Owner");
         SQLSegmentAssert.assertIs(assertContext, actual, expected);
         if (null == expected.getOwner()) {
diff --git a/test/it/parser/src/main/resources/case/dml/select.xml 
b/test/it/parser/src/main/resources/case/dml/select.xml
index cb0f0387d4a..77b056ee8a5 100644
--- a/test/it/parser/src/main/resources/case/dml/select.xml
+++ b/test/it/parser/src/main/resources/case/dml/select.xml
@@ -14027,4 +14027,25 @@
             <row-count expression="CASE WHEN true THEN 10 ELSE 20 END" 
start-index="23" stop-index="58" />
         </limit>
     </select>
+
+    <select sql-case-id="select_func">
+        <projections start-index="7" stop-index="38">
+            <expression-projection text="public.int4range(400, 500, '[]')" 
start-index="7" stop-index="38">
+                <expr>
+                    <function start-index="7" stop-index="38" 
text="public.int4range(400, 500, '[]')" function-name="int4range">
+                        <owner name="public" start-index="7" stop-index="12" />
+                        <parameter>
+                            <literal-expression value="400" start-index="24" 
stop-index="26" />
+                        </parameter>
+                        <parameter>
+                            <literal-expression value="500" start-index="29" 
stop-index="31" />
+                        </parameter>
+                        <parameter>
+                            <literal-expression value="[]" start-index="34" 
stop-index="37" />
+                        </parameter>
+                    </function>
+                </expr>
+            </expression-projection>
+        </projections>
+    </select>
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/select.xml 
b/test/it/parser/src/main/resources/sql/supported/dml/select.xml
index e4d0deff06c..ff0efe4cfd0 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/select.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/select.xml
@@ -514,4 +514,5 @@
     <sql-case id="select_limit_offset_combined" value="SELECT * FROM t4 LIMIT 
5 OFFSET 10;" db-types="PostgreSQL,openGauss" />
     <sql-case id="select_limit_parameter" value="SELECT * FROM t4 LIMIT ?;" 
db-types="PostgreSQL,openGauss" />
     <sql-case id="select_limit_complex_expr" value="SELECT * FROM t4 LIMIT 
(CASE WHEN true THEN 10 ELSE 20 END);" db-types="PostgreSQL,openGauss" />
+    <sql-case id="select_func" value="select public.int4range(400, 500, 
'[]');" db-types="PostgreSQL" />
 </sql-cases>

Reply via email to