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>