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>

Reply via email to