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 ebad4d18e1c Support parsing SQL Server INSERT INTO sql #29193 (#30002)
ebad4d18e1c is described below

commit ebad4d18e1c39c0043fcc7c2c55867de3e6765bf
Author: yydeng626 <[email protected]>
AuthorDate: Thu Feb 8 13:51:11 2024 +0800

    Support parsing SQL Server INSERT INTO sql #29193 (#30002)
---
 .../parser/src/main/resources/case/dml/insert.xml  |  76 +++++++++++
 .../parser/src/main/resources/case/dml/select.xml  | 151 +++++++++++++++++++++
 .../parser/src/main/resources/case/dml/update.xml  |  29 ++++
 .../main/resources/sql/supported/dml/insert.xml    |   3 +
 .../main/resources/sql/supported/dml/select.xml    |   3 +
 .../main/resources/sql/supported/dml/update.xml    |   1 +
 6 files changed, 263 insertions(+)

diff --git a/test/it/parser/src/main/resources/case/dml/insert.xml 
b/test/it/parser/src/main/resources/case/dml/insert.xml
index 0ab3f1d1e9e..d12092c498e 100644
--- a/test/it/parser/src/main/resources/case/dml/insert.xml
+++ b/test/it/parser/src/main/resources/case/dml/insert.xml
@@ -3635,4 +3635,80 @@
             </value>
         </values>
     </insert>
+    
+    <insert sql-case-id="insert_with_currency_value_2">
+        <table name="Employees" start-index="12" stop-index="27" 
start-delimiter="[" end-delimiter="]">
+            <owner name="HR" start-index="12" stop-index="15" 
start-delimiter="[" end-delimiter="]" />
+        </table>
+        <columns start-index="28" stop-index="69">
+            <column name="SSN" start-index="29" stop-index="33" 
start-delimiter="[" end-delimiter="]" />
+            <column name="FirstName" start-index="36" stop-index="46" 
start-delimiter="[" end-delimiter="]" />
+            <column name="LastName" start-index="49" stop-index="58" 
start-delimiter="[" end-delimiter="]" />
+            <column name="Salary" start-index="61" stop-index="68" 
start-delimiter="[" end-delimiter="]" />
+        </columns>
+        <values>
+            <value>
+                <assignment-value>
+                    <literal-expression value="990-00-6818" start-index="79" 
stop-index="91" />
+                </assignment-value>
+                <assignment-value>
+                    <literal-expression value="Kim" start-index="94" 
stop-index="99" />
+                </assignment-value>
+                <assignment-value>
+                    <literal-expression value="Abercrombie" start-index="102" 
stop-index="115" />
+                </assignment-value>
+                <assignment-value>
+                    <common-expression text="$55415" start-index="118" 
stop-index="123" />
+                </assignment-value>
+            </value>
+        </values>
+    </insert>
+    
+    <insert sql-case-id="insert_with_cross_database_values">
+        <table name="SourceTable" start-index="7" stop-index="42" 
start-delimiter="[" end-delimiter="]">
+            <owner name="dbo" start-index="24" stop-index="28" 
start-delimiter="[" end-delimiter="]">
+                <owner name="SourceDatabase" start-index="7" stop-index="22" 
start-delimiter="[" end-delimiter="]" />
+            </owner>
+        </table>
+        <columns start-index="43" stop-index="43" />
+        <values>
+            <value>
+                <assignment-value>
+                    <literal-expression value="1" start-index="52" 
stop-index="52" />
+                </assignment-value>
+                <assignment-value>
+                    <literal-expression value="Bob" start-index="55" 
stop-index="60" />
+                </assignment-value>
+            </value>
+            <value>
+                <assignment-value>
+                    <literal-expression value="2" start-index="64" 
stop-index="64" />
+                </assignment-value>
+                <assignment-value>
+                    <literal-expression value="Susan" start-index="67" 
stop-index="74" />
+                </assignment-value>
+            </value>
+        </values>
+    </insert>
+    
+    <insert sql-case-id="insert_with_cross_database_select">
+        <table name="DestTable_InMem" start-index="7" stop-index="51" 
start-delimiter="[" end-delimiter="]">
+            <owner name="dbo" start-index="29" stop-index="33" 
start-delimiter="[" end-delimiter="]">
+                <owner name="DestinationDatabase" start-index="7" 
stop-index="27" start-delimiter="[" end-delimiter="]" />
+            </owner>
+        </table>
+        <columns start-index="52" stop-index="52" />
+        <select>
+            <projections start-index="60" stop-index="60">
+                <shorthand-projection start-index="60" stop-index="60"/>
+            </projections>
+            <from>
+                <simple-table name="SourceTable" start-index="67" 
stop-index="102" start-delimiter="[" end-delimiter="]">
+                    <owner name="dbo" start-index="84" stop-index="88" 
start-delimiter="[" end-delimiter="]">
+                        <owner name="SourceDatabase" start-index="67" 
stop-index="82" start-delimiter="[" end-delimiter="]" />
+                    </owner>
+                </simple-table>
+            </from>
+        </select>
+    </insert>
 </sql-parser-test-cases>
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 451ce16c621..80b7bcfcfa2 100644
--- a/test/it/parser/src/main/resources/case/dml/select.xml
+++ b/test/it/parser/src/main/resources/case/dml/select.xml
@@ -8426,4 +8426,155 @@
             </simple-table>
         </from>
     </select>
+    
+    <select sql-case-id="select_dm_exec_requests">
+        <from start-index="461" stop-index="556">
+            <join-table join-type="CROSS">
+                <left>
+                    <simple-table name="dm_exec_requests" alias="req" 
start-index="461" stop-index="493" start-delimiter="[" end-delimiter="]">
+                        <owner name="sys" start-index="461" stop-index="465" 
start-delimiter="[" end-delimiter="]" />
+                    </simple-table>
+                </left>
+                <right>
+                    <function-table table-alias="ST">
+                        <table-function function-name="[sys].dm_exec_sql_text" 
text="[sys].dm_exec_sql_text([req].[sql_handle])" start-index="507" 
stop-index="548">
+                            <parameter>
+                                <column name="sql_handle" start-index="530" 
stop-index="547">
+                                    <owner name="req" start-index="530"  
stop-index="534" />
+                                </column>
+                            </parameter>
+                        </table-function>
+                    </function-table>
+                </right>
+            </join-table>
+        </from>
+        <projections start-index="7" stop-index="454">
+            <column-projection name="session_id" start-index="7" 
stop-index="24" start-delimiter="[" end-delimiter="]">
+                <owner name="req" start-index="7" stop-index="11" 
start-delimiter="[" end-delimiter="]" />
+            </column-projection>
+            <column-projection name="start_time" start-index="26" 
stop-index="43" start-delimiter="[" end-delimiter="]">
+                <owner name="req" start-index="26" stop-index="30" 
start-delimiter="[" end-delimiter="]" />
+            </column-projection>
+            <column-projection name="cpu_time" alias="cpu_time_ms" 
start-index="45" stop-index="77" start-delimiter="[" end-delimiter="]">
+                <owner name="req" start-index="45" stop-index="49" 
start-delimiter="[" end-delimiter="]" />
+            </column-projection>
+            <expression-projection text="OBJECT_NAME([ST].[objectid], 
[ST].[dbid])" alias="ObjectName" start-index="79" stop-index="135">
+                <expr>
+                    <function function-name="OBJECT_NAME" 
text="OBJECT_NAME([ST].[objectid], [ST].[dbid])" start-index="79" 
stop-index="119">
+                        <parameter>
+                            <column name="objectid" start-index="91" 
stop-index="105" start-delimiter="[" end-delimiter="]">
+                                <owner name="ST" start-index="91" 
stop-index="94" start-delimiter="[" end-delimiter="]" />
+                            </column>
+                        </parameter>
+                        <parameter>
+                            <column name="dbid" start-index="108" 
stop-index="118" start-delimiter="[" end-delimiter="]">
+                                <owner name="ST" start-index="108" 
stop-index="111" start-delimiter="[" end-delimiter="]" />
+                            </column>
+                        </parameter>
+                    </function>
+                </expr>
+            </expression-projection>
+            <expression-projection 
text="SUBSTRING(REPLACE(REPLACE(SUBSTRING([ST].[text],
+    ([req].[statement_start_offset] / 2) + 1, ((CASE 
[req].[statement_end_offset] WHEN -1 THEN DATALENGTH([ST].[text]) ELSE 
[req].[statement_end_offset] END - [req].[statement_start_offset]) / 2) + 1 ), 
CHAR(10), ' ' ), CHAR(13), ' ' ), 1, 512 )" alias="statement_text" 
start-index="137" stop-index="454">
+                <expr>
+                    <function function-name="SUBSTRING" 
text="SUBSTRING(REPLACE(REPLACE(SUBSTRING([ST].[text],
+    ([req].[statement_start_offset] / 2) + 1, ((CASE 
[req].[statement_end_offset] WHEN -1 THEN DATALENGTH([ST].[text]) ELSE 
[req].[statement_end_offset] END - [req].[statement_start_offset]) / 2) + 1 ), 
CHAR(10), ' ' ), CHAR(13), ' ' ), 1, 512 )" start-index="137" stop-index="430">
+                        <parameter>
+                            <function function-name="REPLACE" 
text="REPLACE(REPLACE(SUBSTRING([ST].[text],
+    ([req].[statement_start_offset] / 2) + 1, ((CASE 
[req].[statement_end_offset] WHEN -1 THEN DATALENGTH([ST].[text]) ELSE 
[req].[statement_end_offset] END - [req].[statement_start_offset]) / 2) + 1 ), 
CHAR(10), ' ' ), CHAR(13), ' ' )" start-index="147" stop-index="420">
+                                <parameter>
+                                    <function function-name="REPLACE" 
text="REPLACE(SUBSTRING([ST].[text],
+    ([req].[statement_start_offset] / 2) + 1, ((CASE 
[req].[statement_end_offset] WHEN -1 THEN DATALENGTH([ST].[text]) ELSE 
[req].[statement_end_offset] END - [req].[statement_start_offset]) / 2) + 1 ), 
CHAR(10), ' ' )" start-index="155" stop-index="403">
+                                        <parameter>
+                                            <function 
function-name="SUBSTRING" text="SUBSTRING([ST].[text],
+    ([req].[statement_start_offset] / 2) + 1, ((CASE 
[req].[statement_end_offset] WHEN -1 THEN DATALENGTH([ST].[text]) ELSE 
[req].[statement_end_offset] END - [req].[statement_start_offset]) / 2) + 1 )" 
start-index="163" stop-index="386">
+                                                <parameter>
+                                                    <column name="text" 
start-index="173" stop-index="183" start-delimiter="[" end-delimiter="]">
+                                                        <owner name="ST" 
start-index="173" stop-index="176" start-delimiter="[" end-delimiter="]" />
+                                                    </column>
+                                                </parameter>
+                                                <parameter>
+                                                    
<binary-operation-expression text="([req].[statement_start_offset] / 2) + 1" 
start-index="190" stop-index="229">
+                                                        <left>
+                                                            
<binary-operation-expression text="[req].[statement_start_offset] / 2" 
start-index="191" stop-index="224">
+                                                                <left>
+                                                                    <column 
name="statement_start_offset" start-index="191" stop-index="220" 
start-delimiter="[" end-delimiter="]">
+                                                                        <owner 
name="req" start-index="191" stop-index="195" start-delimiter="[" 
end-delimiter="]" />
+                                                                    </column>
+                                                                </left>
+                                                                <right>
+                                                                    
<literal-expression value="2" start-index="224" stop-index="224" />
+                                                                </right>
+                                                                
<operator>/</operator>
+                                                            
</binary-operation-expression>
+                                                        </left>
+                                                        <operator>+</operator>
+                                                        <right>
+                                                            
<literal-expression value="1" start-index="229" stop-index="229" />
+                                                        </right>
+                                                    
</binary-operation-expression>
+                                                </parameter>
+                                                <parameter>
+                                                    
<binary-operation-expression text="((CASE [req].[statement_end_offset] WHEN -1 
THEN DATALENGTH([ST].[text]) ELSE [req].[statement_end_offset] END - 
[req].[statement_start_offset]) / 2) + 1" start-index="232" stop-index="384">
+                                                        <left>
+                                                            
<binary-operation-expression text="(CASE [req].[statement_end_offset] WHEN -1 
THEN DATALENGTH([ST].[text]) ELSE [req].[statement_end_offset] END - 
[req].[statement_start_offset]) / 2" start-index="233" stop-index="379">
+                                                                <left>
+                                                                    
<binary-operation-expression text="CASE [req].[statement_end_offset] WHEN -1 
THEN DATALENGTH([ST].[text]) ELSE [req].[statement_end_offset] END - 
[req].[statement_start_offset]" start-index="234" stop-index="374">
+                                                                        <left>
+                                                                            
<common-expression 
text="CASE[req].[statement_end_offset]WHEN-1THENDATALENGTH([ST].[text])ELSE[req].[statement_end_offset]END"
 start-index="234" stop-index="341" />
+                                                                        </left>
+                                                                        <right>
+                                                                            
<column name="statement_start_offset" start-index="345" stop-index="374" 
start-delimiter="[" end-delimiter="]">
+                                                                               
 <owner name="req" start-index="345" stop-index="349" start-delimiter="[" 
end-delimiter="]" />
+                                                                            
</column>
+                                                                        
</right>
+                                                                        
<operator>-</operator>
+                                                                    
</binary-operation-expression>
+                                                                </left>
+                                                                <right>
+                                                                    
<literal-expression value="2" start-index="379" stop-index="379" />
+                                                                </right>
+                                                                
<operator>/</operator>
+                                                            
</binary-operation-expression>
+                                                        </left>
+                                                        <operator>+</operator>
+                                                        <right>
+                                                            
<literal-expression value="1" start-index="384" stop-index="384" />
+                                                        </right>
+                                                    
</binary-operation-expression>
+                                                </parameter>
+                                            </function>
+                                        </parameter>
+                                        <parameter>
+                                            <function function-name="CHAR" 
text="CHAR(10)" start-index="389" stop-index="396" />
+                                        </parameter>
+                                        <parameter>
+                                            <literal-expression value=" " 
start-index="399" stop-index="401" />
+                                        </parameter>
+                                    </function>
+                                </parameter>
+                                <parameter>
+                                    <function function-name="CHAR" 
text="CHAR(13)" start-index="406" stop-index="413" />
+                                </parameter>
+                                <parameter>
+                                    <literal-expression value=" " 
start-index="416" stop-index="418" />
+                                </parameter>
+                            </function>
+                        </parameter>
+                        <parameter>
+                            <literal-expression value="1" start-index="423" 
stop-index="423"/>
+                        </parameter>
+                        <parameter>
+                            <literal-expression value="512" start-index="426" 
stop-index="428"/>
+                        </parameter>
+                    </function>
+                </expr>
+            </expression-projection>
+        </projections>
+        <order-by>
+            <column-item name="cpu_time" start-index="567" stop-index="582" 
order-direction="DESC" start-delimiter="[" end-delimiter="]">
+                <owner name="req" start-index="567" stop-index="571" 
start-delimiter="[" end-delimiter="]" />
+            </column-item>
+        </order-by>
+    </select>
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/case/dml/update.xml 
b/test/it/parser/src/main/resources/case/dml/update.xml
index e06e4a0eb7e..722e05076a6 100644
--- a/test/it/parser/src/main/resources/case/dml/update.xml
+++ b/test/it/parser/src/main/resources/case/dml/update.xml
@@ -2090,4 +2090,33 @@
             </from>
         </set>
     </update>
+    
+    <update sql-case-id="update_with_print">
+        <table start-index="7" stop-index="29">
+            <simple-table name="Employee" start-index="7" stop-index="29">
+                <owner name="HumanResources" start-index="7" stop-index="20" />
+            </simple-table>
+        </table>
+        <set start-index="31" stop-index="57">
+            <assignment start-index="35" stop-index="57">
+                <column name="JobTitle" start-index="35" stop-index="42" />
+                <assignment-value>
+                    <literal-expression value="Executive" start-index="46" 
stop-index="57" />
+                </assignment-value>
+            </assignment>
+        </set>
+        <where start-index="59" stop-index="92">
+            <expr>
+                <binary-operation-expression start-index="65" stop-index="92">
+                    <left>
+                        <column name="NationalIDNumber" start-index="65" 
stop-index="80" />
+                    </left>
+                    <right>
+                        <literal-expression value="123456789" start-index="84" 
stop-index="92" />
+                    </right>
+                    <operator>=</operator>
+                </binary-operation-expression>
+            </expr>
+        </where>
+    </update>
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/insert.xml 
b/test/it/parser/src/main/resources/sql/supported/dml/insert.xml
index 39b2f27aecb..d230ffc6f6b 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/insert.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/insert.xml
@@ -138,4 +138,7 @@
     <sql-case id="insert_into_player_with_compress_function" value="INSERT 
INTO player ( name,surname,info) VALUES (N'Ovidiu', 
N'Cracium',COMPRESS(N'{&quot;sport&quot;:&quot;Tennis&quot;,&quot;age&quot;: 
28,&quot;rank&quot;:1,&quot;points&quot;:15258, &quot;turn&quot;:17}'))" 
db-types="SQLServer"/>
     <sql-case id="insert_into_tmp_with_exec" value="INSERT INTO #temp (id, 
job_name, job_id, dynamic_filter_login,dynamic_filter_hostname, 
dynamic_snapshot_location,frequency_type, frequency_interval, 
frequency_subday_type,frequency_subday_interval, frequency_relative_interval, 
frequency_recurrence_factor, active_start_date, active_end_date, 
active_start_time,active_end_time) EXEC sp_helpdynamicsnapshot_job" 
db-types="SQLServer"/>
     <sql-case id="insert_into_player_with_compress_function_2" value="INSERT 
INTO player (name,surname,info) VALUES (N'Michael',N'Raheem',COMPRESS(@info))" 
db-types="SQLServer"/>
+    <sql-case id="insert_with_currency_value_2" value="INSERT INTO 
[HR].[Employees]([SSN], [FirstName], [LastName], [Salary]) VALUES 
('990-00-6818', N'Kim', N'Abercrombie', $55415)" db-types="SQLServer"/>
+    <sql-case id="insert_with_cross_database_values" value="INSERT 
[SourceDatabase].[dbo].[SourceTable] VALUES (1, N'Bob'),(2, N'Susan')" 
db-types="SQLServer"/>
+    <sql-case id="insert_with_cross_database_select" value="INSERT 
[DestinationDatabase].[dbo].[DestTable_InMem] SELECT * FROM 
[SourceDatabase].[dbo].[SourceTable]" db-types="SQLServer"/>
 </sql-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 b44a53f9935..22fd7b5eef1 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
@@ -258,4 +258,7 @@
     <sql-case id="select_from_physical_stats_function" value="SELECT 
page_count, compressed_page_count, forwarded_record_count, * FROM 
sys.dm_db_index_physical_stats(db_id(), object_id('t3'), NULL, NULL, 
'SAMPLED')" db-types="SQLServer"/>
     <sql-case id="select_from_msdb_default_schema" value="SELECT 
backup_size/compressed_backup_size FROM msdb..backupset" db-types="SQLServer"/>
     <sql-case id="select_from_database_files_2" value="SELECT file_id, name, 
type_desc, physical_name, size, max_size FROM sys.database_files" 
db-types="SQLServer"/>
+    <sql-case id="select_dm_exec_requests" value="SELECT 
[req].[session_id],[req].[start_time],[req].[cpu_time] AS 
[cpu_time_ms],OBJECT_NAME([ST].[objectid], [ST].[dbid]) AS 
[ObjectName],SUBSTRING(REPLACE(REPLACE(SUBSTRING([ST].[text],
+    ([req].[statement_start_offset] / 2) + 1, ((CASE 
[req].[statement_end_offset] WHEN -1 THEN DATALENGTH([ST].[text]) ELSE 
[req].[statement_end_offset] END - [req].[statement_start_offset]) / 2) + 1 ), 
CHAR(10), ' ' ), CHAR(13), ' ' ), 1, 512 )
+    AS [statement_text] FROM [sys].[dm_exec_requests] AS [req] CROSS APPLY 
[sys].dm_exec_sql_text([req].[sql_handle]) AS [ST] ORDER BY [req].[cpu_time] 
DESC" db-types="SQLServer"/>
 </sql-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/update.xml 
b/test/it/parser/src/main/resources/sql/supported/dml/update.xml
index 9043c94a55a..7a66ca8a754 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/update.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/update.xml
@@ -63,4 +63,5 @@
     <sql-case id="update_with_plus_eq_symbol" value="UPDATE Production.Product 
SET ListPrice += @NewPrice WHERE Color = N'Red'" db-types="SQLServer"/>
     <sql-case id="update_scrapreason_with_between_and" value="UPDATE 
Production.ScrapReason SET Name += ' - tool malfunction' WHERE ScrapReasonID 
BETWEEN 10 and 12" db-types="SQLServer"/>
     <sql-case id="update_sr_with_join_subquery" value="UPDATE sr SET sr.Name 
+= ' - tool malfunction' FROM Production.ScrapReason AS sr JOIN 
Production.WorkOrder AS wo ON sr.ScrapReasonID = wo.ScrapReasonID AND 
wo.ScrappedQty &gt; 300" db-types="SQLServer"/>
+    <sql-case id="update_with_print" value="UPDATE HumanResources.Employee SET 
JobTitle = N'Executive' WHERE NationalIDNumber = 123456789  IF @@ROWCOUNT = 0  
PRINT 'Warning: No rows were updated'" db-types="SQLServer" />
 </sql-cases>

Reply via email to