This is an automated email from the ASF dual-hosted git repository.
chengzhang 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 c9e210d401c fix:Support for the AI_GENERATE_EMBEDDINGS function
(#35922)
c9e210d401c is described below
commit c9e210d401c661e13491c113804d94004ffb113c
Author: cxy <[email protected]>
AuthorDate: Wed Jul 9 08:56:36 2025 +0800
fix:Support for the AI_GENERATE_EMBEDDINGS function (#35922)
* Fix:Full support for xml methods
* Fix:Full support for xml methods
* Fix:Full support for xml methods
* fix:Support for the CHANGETABLE function
* fix:Support for the CHANGETABLE function
* fix:Support for the CHANGETABLE function
* fix:Support for the AI_GENERATE_EMBEDDINGS function
---
.../src/main/antlr4/imports/sqlserver/BaseRule.g4 | 12 ++++++++--
.../antlr4/imports/sqlserver/SQLServerKeyword.g4 | 12 ++++++++++
.../statement/SQLServerStatementVisitor.java | 28 ++++++++++++++++++++--
.../parser/src/main/resources/case/dml/select.xml | 21 ++++++++++++++++
.../main/resources/sql/supported/dml/select.xml | 1 +
5 files changed, 70 insertions(+), 4 deletions(-)
diff --git
a/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/BaseRule.g4
b/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/BaseRule.g4
index bb0b2b7f1f2..be5f06d959d 100644
--- a/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/BaseRule.g4
+++ b/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/BaseRule.g4
@@ -121,7 +121,7 @@ unreservedWord
| ELASTIC_POOL | SERVICE_OBJECTIVE | DATABASE_NAME | ALLOW_CONNECTIONS |
GEO | NAMED | DATEFIRST | BACKUP_STORAGE_REDUNDANCY |
FORCE_FAILOVER_ALLOW_DATA_LOSS | SECONDARY | FAILOVER |
DEFAULT_FULLTEXT_LANGUAGE
| DEFAULT_LANGUAGE | INLINE | NESTED_TRIGGERS | TRANSFORM_NOISE_WORDS |
TWO_DIGIT_YEAR_CUTOFF | PERSISTENT_LOG_BUFFER | DIRECTORY_NAME | DATEFORMAT |
DELAYED_DURABILITY | TRANSFER | SCHEMA | PASSWORD | AUTHORIZATION
| MEMBER | SEARCH | TEXT | SECOND | PRECISION | VIEWS | PROVIDER | COLUMNS
| SUBSTRING | RETURNS | SIZE | CONTAINS | MONTH | INPUT | YEAR
- | TIMESTAMP | TRIM | USER | RIGHT | JSON | SID | OPENQUERY | ACTION |
TARGET | HOUR | MINUTE | TABLE | NODES | VALUE | EXIST | CHANGETABLE | VERSION
| CHANGES
+ | TIMESTAMP | TRIM | USER | RIGHT | JSON | SID | OPENQUERY | ACTION |
TARGET | HOUR | MINUTE | TABLE | NODES | VALUE | EXIST | CHANGETABLE | VERSION
| CHANGES | MODEL | AI_GENERATE_EMBEDDINGS | PARAMETERS | USE
;
databaseName
@@ -318,7 +318,15 @@ distinct
specialFunction
: conversionFunction | charFunction | openJsonFunction | jsonFunction |
openRowSetFunction
| windowFunction | approxFunction | openDatasourceFunction |
rowNumberFunction | graphFunction
- | trimFunction | changeTableFunction
+ | trimFunction | changeTableFunction | aiFunction
+ ;
+
+aiFunction
+ : aiGenerateEmbeddingsFunction
+ ;
+
+aiGenerateEmbeddingsFunction
+ : AI_GENERATE_EMBEDDINGS LP_ expr USE MODEL identifier (PARAMETERS expr)?
RP_
;
changeTableFunction
diff --git
a/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
b/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
index caa357d2aa6..1fbd8317bf7 100644
---
a/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
+++
b/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
@@ -2010,3 +2010,15 @@ VERSION
CHANGES
: C H A N G E S
;
+
+MODEL
+ : M O D E L
+ ;
+
+AI_GENERATE_EMBEDDINGS
+ : A I UL_ G E N E R A T E UL_ E M B E D D I N G S
+ ;
+
+PARAMETERS
+ : P A R A M E T E R S
+ ;
diff --git
a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/SQLServerStatementVisitor.java
b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/SQLServerStatementVisitor.java
index 7d45818e0b6..a46ff082bf4 100644
---
a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/SQLServerStatementVisitor.java
+++
b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/SQLServerStatementVisitor.java
@@ -26,7 +26,6 @@ import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.TerminalNode;
import org.apache.shardingsphere.sql.parser.api.ASTNode;
import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementBaseVisitor;
-import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser;
import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AggregationClauseContext;
import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AggregationFunctionContext;
import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AliasContext;
@@ -237,6 +236,9 @@ import
org.apache.shardingsphere.sql.parser.statement.core.value.literal.impl.St
import
org.apache.shardingsphere.sql.parser.statement.core.value.parametermarker.ParameterMarkerValue;
import
org.apache.shardingsphere.sql.parser.statement.sqlserver.ddl.statistics.SQLServerUpdateStatisticsStatement;
import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ChangeTableFunctionContext;
+import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.XmlMethodCallContext;
+import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AiFunctionContext;
+import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AiGenerateEmbeddingsFunctionContext;
import java.util.Collection;
import java.util.Collections;
@@ -715,16 +717,38 @@ public abstract class SQLServerStatementVisitor extends
SQLServerStatementBaseVi
if (null != ctx.changeTableFunction()) {
return visit(ctx.changeTableFunction());
}
+ if (null != ctx.aiFunction()) {
+ return visit(ctx.aiFunction());
+ }
+ return new FunctionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), ctx.getChild(0).getChild(0).getText(),
getOriginalText(ctx));
+ }
+
+ @Override
+ public ASTNode visitAiFunction(final AiFunctionContext ctx) {
+ if (null != ctx.aiGenerateEmbeddingsFunction()) {
+ return visit(ctx.aiGenerateEmbeddingsFunction());
+ }
return new FunctionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), ctx.getChild(0).getChild(0).getText(),
getOriginalText(ctx));
}
+ @Override
+ public ASTNode visitAiGenerateEmbeddingsFunction(final
AiGenerateEmbeddingsFunctionContext ctx) {
+ FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.AI_GENERATE_EMBEDDINGS().getText(), getOriginalText(ctx));
+ result.getParameters().add((ExpressionSegment) visit(ctx.expr(0)));
+ result.getParameters().add(new
LiteralExpressionSegment(ctx.identifier().getStart().getStartIndex(),
ctx.identifier().getStop().getStopIndex(), ctx.identifier().getText()));
+ if (ctx.expr().size() > 1) {
+ result.getParameters().add((ExpressionSegment) visit(ctx.expr(1)));
+ }
+ return result;
+ }
+
@Override
public ASTNode visitChangeTableFunction(final ChangeTableFunctionContext
ctx) {
return new FunctionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), ctx.CHANGETABLE().getText(),
getOriginalText(ctx));
}
@Override
- public ASTNode visitXmlMethodCall(final
SQLServerStatementParser.XmlMethodCallContext ctx) {
+ public ASTNode visitXmlMethodCall(final XmlMethodCallContext ctx) {
String fullMethodName;
if (null == ctx.alias()) {
fullMethodName = ctx.columnName().getText() + "." +
ctx.xmlMethodName().getText();
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 82b306e53bf..bec6138a59e 100644
--- a/test/it/parser/src/main/resources/case/dml/select.xml
+++ b/test/it/parser/src/main/resources/case/dml/select.xml
@@ -10375,4 +10375,25 @@
</join-table>
</from>l
</select>
+
+ <select sql-case-id="select_ai_generate_embeddings">
+ <projections start-index="7" stop-index="73">
+ <column-projection name="id" start-index="7" stop-index="8" />
+ <expression-projection text="AI_GENERATE_EMBEDDINGS(large_text USE
MODEL MyAzureOpenAIModel)" start-index="11" stop-index="73">
+ <expr>
+ <function start-index="11" stop-index="73"
text="AI_GENERATE_EMBEDDINGS(large_text USE MODEL MyAzureOpenAIModel)"
function-name="AI_GENERATE_EMBEDDINGS">
+ <parameter>
+ <column name="large_text" start-index="34"
stop-index="43" />
+ </parameter>
+ <parameter>
+ <literal-expression value="MyAzureOpenAIModel"
start-index="55" stop-index="72" />
+ </parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ <from>
+ <simple-table name="myTable" start-index="80" stop-index="86" />
+ </from>
+ </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 6e0472b45e5..1d4ba111223 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
@@ -324,4 +324,5 @@
<sql-case id="select_with_string_literal" value="select
translate(t.order_no, '\1234567890', '\', '\\', '', '\\\', '''', '\n\t\b') from
t" db-types="Oracle" />
<sql-case id="select_instruction_nodes" value="SELECT T2.Loc.query('.')
FROM T CROSS APPLY Instructions.nodes('/root/Location') AS T2(Loc) "
db-types="SQLServer"/>
<sql-case id="select_cross_apply_changetable_version" value="SELECT e.[Emp
ID], e.SSN, e.FirstName, e.LastName, c.SYS_CHANGE_VERSION, c.SYS_CHANGE_CONTEXT
FROM Employees AS e CROSS APPLY CHANGETABLE (VERSION Employees, ([Emp ID],
SSN), (e.[Emp ID], e.SSN)) AS c;" db-types="SQLServer"/>
+ <sql-case id="select_ai_generate_embeddings" value="SELECT id,
AI_GENERATE_EMBEDDINGS(large_text USE MODEL MyAzureOpenAIModel) FROM myTable;"
db-types="SQLServer"/>
</sql-cases>