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 37f21852901 Support parsing SQL Server SELECT COUNT(*) sql (#29433)
37f21852901 is described below
commit 37f218529013e1bf1dd856e8f065083695385c7b
Author: LotusMoon <[email protected]>
AuthorDate: Tue Dec 19 18:00:14 2023 +0800
Support parsing SQL Server SELECT COUNT(*) sql (#29433)
* Support parsing SQL Server SELECT COUNT(*) sql
* refactor to pass the spotless check
* Refactor the code according to CR rules
---
.../src/main/antlr4/imports/sqlserver/BaseRule.g4 | 2 +-
.../main/antlr4/imports/sqlserver/DMLStatement.g4 | 6 +-
.../src/main/antlr4/imports/sqlserver/Literals.g4 | 2 +-
.../antlr4/imports/sqlserver/SQLServerKeyword.g4 | 4 +
.../statement/SQLServerStatementVisitor.java | 25 ++++-
.../segment/dml/item/ColumnProjectionSegment.java | 4 +-
.../dml/item/ExpressionProjectionSegment.java | 7 +-
.../parser/src/main/resources/case/dml/insert.xml | 40 +++++++
.../parser/src/main/resources/case/dml/select.xml | 125 +++++++++++++++++++++
.../main/resources/sql/supported/dml/insert.xml | 1 +
.../main/resources/sql/supported/dml/select.xml | 3 +
11 files changed, 208 insertions(+), 11 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 27e745e4eec..607a2812bc7 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
@@ -120,7 +120,7 @@ unreservedWord
| DATA_RETENTION | TEMPORAL_HISTORY_RETENTION | EDITION |
MIXED_PAGE_ALLOCATION | DISABLED | ALLOWED | HADR | MULTI_USER |
RESTRICTED_USER | SINGLE_USER | OFFLINE | EMERGENCY | SUSPEND |
DATE_CORRELATION_OPTIMIZATION
| 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
+ | MEMBER | SEARCH | TEXT | SECOND
;
databaseName
diff --git
a/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/DMLStatement.g4
b/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/DMLStatement.g4
index 05e32f0c2c9..ee6088cdba5 100644
---
a/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/DMLStatement.g4
+++
b/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/DMLStatement.g4
@@ -93,7 +93,8 @@ projections
;
projection
- : (top | columnName | expr) (AS? alias)? | qualifiedShorthand
+ : (alias EQ_)? (top | columnName | expr) | qualifiedShorthand
+ | (top | columnName | expr) (AS? alias)? | qualifiedShorthand
;
top
@@ -125,12 +126,13 @@ tableReference
;
tableFactor
- : tableName (AS? alias)? | subquery AS? alias columnNames? | LP_
tableReferences RP_
+ : tableName (AS? alias)? | subquery AS? alias columnNames? | expr (AS?
alias) ? | LP_ tableReferences RP_
;
joinedTable
: NATURAL? ((INNER | CROSS)? JOIN) tableFactor joinSpecification?
| NATURAL? (LEFT | RIGHT | FULL) OUTER? JOIN tableFactor joinSpecification?
+ | (CROSS | OUTER) APPLY tableFactor joinSpecification?
;
joinSpecification
diff --git
a/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/Literals.g4
b/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/Literals.g4
index 3f259ff7491..a732140da20 100644
--- a/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/Literals.g4
+++ b/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/Literals.g4
@@ -24,7 +24,7 @@ IDENTIFIER_
;
DELIMITED_IDENTIFIER_
- : (LBT_ | DQ_) [a-zA-Z0-9@$#_,.\\/\u0080-\uFFFF ]+ (DQ_ | RBT_)
+ : (LBT_ | DQ_) [a-zA-Z0-9@$#_,.\-\\/\u0080-\uFFFF ]+ (DQ_ | RBT_)
;
STRING_
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 b942380b097..9aabc67b9b7 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
@@ -1910,3 +1910,7 @@ WITHOUT_ARRAY_WRAPPER
XMLNAMESPACES
: X M L N A M E S P A C E S
;
+
+APPLY
+ : A P P L Y
+ ;
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 0e50e554efe..efe46ed1b7f 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
@@ -112,6 +112,7 @@ import
org.apache.shardingsphere.sql.parser.sql.common.enums.AggregationType;
import org.apache.shardingsphere.sql.parser.sql.common.enums.JoinType;
import org.apache.shardingsphere.sql.parser.sql.common.enums.OrderDirection;
import
org.apache.shardingsphere.sql.parser.sql.common.enums.ParameterMarkerType;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.ConstraintSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.IndexNameSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.IndexSegment;
@@ -172,6 +173,7 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.Sub
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableSegment;
import org.apache.shardingsphere.sql.parser.sql.common.util.SQLUtils;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.FunctionTableSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.value.collection.CollectionValue;
import
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
import
org.apache.shardingsphere.sql.parser.sql.common.value.keyword.KeywordValue;
@@ -1204,8 +1206,8 @@ public abstract class SQLServerStatementVisitor extends
SQLServerStatementBaseVi
}
if (projection instanceof BinaryOperationExpression) {
BinaryOperationExpression binaryExpression =
(BinaryOperationExpression) projection;
- int startIndex = binaryExpression.getStartIndex();
- int stopIndex = null == alias ? binaryExpression.getStopIndex() :
alias.getStopIndex();
+ int startIndex = getStartIndexWithAlias(binaryExpression, alias);
+ int stopIndex = getStopIndexWithAlias(binaryExpression, alias);
ExpressionProjectionSegment result = new
ExpressionProjectionSegment(startIndex, stopIndex, binaryExpression.getText(),
binaryExpression);
result.setAlias(alias);
return result;
@@ -1216,12 +1218,19 @@ public abstract class SQLServerStatementVisitor extends
SQLServerStatementBaseVi
return projection;
}
LiteralExpressionSegment column = (LiteralExpressionSegment)
projection;
- ExpressionProjectionSegment result = null == alias ? new
ExpressionProjectionSegment(column.getStartIndex(), column.getStopIndex(),
String.valueOf(column.getLiterals()), column)
- : new ExpressionProjectionSegment(column.getStartIndex(),
ctx.alias().stop.getStopIndex(), String.valueOf(column.getLiterals()), column);
+ ExpressionProjectionSegment result = new
ExpressionProjectionSegment(getStartIndexWithAlias(column, alias),
getStopIndexWithAlias(column, alias), String.valueOf(column.getLiterals()),
column);
result.setAlias(alias);
return result;
}
+ private int getStartIndexWithAlias(final SQLSegment sqlSegment, final
AliasSegment alias) {
+ return null != alias && alias.getStartIndex() <
sqlSegment.getStartIndex() ? alias.getStartIndex() : sqlSegment.getStartIndex();
+ }
+
+ private int getStopIndexWithAlias(final SQLSegment sqlSegment, final
AliasSegment alias) {
+ return null != alias && alias.getStopIndex() >
sqlSegment.getStopIndex() ? alias.getStopIndex() : sqlSegment.getStopIndex();
+ }
+
@Override
public ASTNode visitFromClause(final FromClauseContext ctx) {
return visit(ctx.tableReferences());
@@ -1259,6 +1268,14 @@ public abstract class SQLServerStatementVisitor extends
SQLServerStatementBaseVi
}
return result;
}
+ if (null != ctx.expr()) {
+ ExpressionSegment exprSegment = (ExpressionSegment)
visit(ctx.expr());
+ FunctionTableSegment result = new
FunctionTableSegment(exprSegment.getStartIndex(), exprSegment.getStopIndex(),
exprSegment);
+ if (null != ctx.alias()) {
+ result.setAlias((AliasSegment) visit(ctx.alias()));
+ }
+ return result;
+ }
return visit(ctx.tableReferences());
}
diff --git
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ColumnProjectionSegment.java
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ColumnProjectionSegment.java
index e9fb6ef11ae..3a72c3660e0 100644
---
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ColumnProjectionSegment.java
+++
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ColumnProjectionSegment.java
@@ -60,12 +60,12 @@ public final class ColumnProjectionSegment implements
ProjectionSegment, AliasAv
@Override
public int getStartIndex() {
- return column.getStartIndex();
+ return null != alias && alias.getStartIndex() < column.getStartIndex()
? alias.getStartIndex() : column.getStartIndex();
}
@Override
public int getStopIndex() {
- return null == alias ? column.getStopIndex() : alias.getStopIndex();
+ return null != alias && alias.getStopIndex() > column.getStopIndex() ?
alias.getStopIndex() : column.getStopIndex();
}
/**
diff --git
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ExpressionProjectionSegment.java
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ExpressionProjectionSegment.java
index 2373529a8e3..9b171ecff9f 100644
---
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ExpressionProjectionSegment.java
+++
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/item/ExpressionProjectionSegment.java
@@ -83,8 +83,13 @@ public final class ExpressionProjectionSegment implements
ProjectionSegment, Com
return alias;
}
+ @Override
+ public int getStartIndex() {
+ return null != alias && alias.getStartIndex() < startIndex ?
alias.getStartIndex() : startIndex;
+ }
+
@Override
public int getStopIndex() {
- return null == alias ? stopIndex : alias.getStopIndex();
+ return null != alias && alias.getStopIndex() > stopIndex ?
alias.getStopIndex() : stopIndex;
}
}
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 c8a4565dc46..0baf66a99b8 100644
--- a/test/it/parser/src/main/resources/case/dml/insert.xml
+++ b/test/it/parser/src/main/resources/case/dml/insert.xml
@@ -2900,6 +2900,7 @@
</from>
</select>
</insert>
+
<insert sql-case-id="insert_with_nchar_1">
<table name="T1" start-index="12" stop-index="17">
<owner name="dbo" start-index="12" stop-index="14" />
@@ -2916,6 +2917,7 @@
</value>
</values>
</insert>
+
<insert sql-case-id="insert_with_nchar_2">
<table name="T1" start-index="12" stop-index="17">
<owner name="dbo" start-index="12" stop-index="14" />
@@ -2932,6 +2934,7 @@
</value>
</values>
</insert>
+
<insert sql-case-id="insert_with_nchar_3">
<table name="T1" start-index="12" stop-index="17">
<owner name="dbo" start-index="12" stop-index="14" />
@@ -2948,6 +2951,7 @@
</value>
</values>
</insert>
+
<insert sql-case-id="insert_with_data_base_name">
<table name="VariableTest" start-index="12" stop-index="46">
<owner name="dbo" start-index="31" stop-index="33">
@@ -2965,4 +2969,40 @@
</value>
</values>
</insert>
+
+ <insert sql-case-id="insert_with_batch_nchar">
+ <table name="Employees" start-index="12" stop-index="31">
+ <owner name="TestSchema" start-index="12" stop-index="21"/>
+ </table>
+ <columns start-index="33" stop-index="48">
+ <column name="Name" start-index="34" stop-index="37"/>
+ <column name="Location" start-index="40" stop-index="47"/>
+ </columns>
+ <values>
+ <value>
+ <assignment-value>
+ <literal-expression value="Jared" start-index="58"
stop-index="65"/>
+ </assignment-value>
+ <assignment-value>
+ <literal-expression value="Australia" start-index="69"
stop-index="80"/>
+ </assignment-value>
+ </value>
+ <value>
+ <assignment-value>
+ <literal-expression value="Nikita" start-index="85"
stop-index="93"/>
+ </assignment-value>
+ <assignment-value>
+ <literal-expression value="India" start-index="96"
stop-index="103"/>
+ </assignment-value>
+ </value>
+ <value>
+ <assignment-value>
+ <literal-expression value="Tom" start-index="108"
stop-index="113"/>
+ </assignment-value>
+ <assignment-value>
+ <literal-expression value="Germany" start-index="116"
stop-index="125"/>
+ </assignment-value>
+ </value>
+ </values>
+ </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 859271a97e1..8ecae2c21f6 100644
--- a/test/it/parser/src/main/resources/case/dml/select.xml
+++ b/test/it/parser/src/main/resources/case/dml/select.xml
@@ -7681,4 +7681,129 @@
</expression-projection>
</projections>
</select>
+
+ <select sql-case-id="select_with_count_temp_table">
+ <from>
+ <simple-table name="#Test" start-index="41" stop-index="45" />
+ </from>
+ <projections start-index="7" stop-index="34">
+ <aggregation-projection type="COUNT" expression="COUNT(*)"
start-index="7" stop-index="14" alias="Number of rows"/>
+ </projections>
+ </select>
+
+ <select sql-case-id="select_with_bracket_alias">
+ <from>
+ <join-table join-type="INNER">
+ <left>
+ <simple-table name="dm_xe_objects" alias="obj1"
start-index="139" stop-index="163">
+ <owner name="sys" start-index="139" stop-index="141"/>
+ </simple-table>
+ </left>
+ <right>
+ <simple-table name="dm_xe_object_columns" alias="col2"
start-index="176" stop-index="207">
+ <owner name="sys" start-index="176" stop-index="178"/>
+ </simple-table>
+ </right>
+ <on-condition>
+ <binary-operation-expression start-index="212"
stop-index="239">
+ <left>
+ <column name="object_name" start-index="212"
stop-index="227">
+ <owner name="col2" start-index="212"
stop-index="215"/>
+ </column>
+ </left>
+ <operator>=</operator>
+ <right>
+ <column name="name" start-index="231"
stop-index="239">
+ <owner name="obj1" start-index="231"
stop-index="234"/>
+ </column>
+ </right>
+ </binary-operation-expression>
+ </on-condition>
+ </join-table>
+ </from>
+ <projections start-index="7" stop-index="132">
+ <column-projection name="name" alias="XEvent-name" start-index="7"
stop-index="32">
+ <owner name="obj1" start-index="7" stop-index="10"/>
+ </column-projection>
+ <column-projection name="name" alias="XEvent-column"
start-index="35" stop-index="62">
+ <owner name="col2" start-index="35" stop-index="38"/>
+ </column-projection>
+ <column-projection name="description" alias="Descr-name"
start-index="65" stop-index="96">
+ <owner name="obj1" start-index="65" stop-index="68"/>
+ </column-projection>
+ <column-projection name="description" alias="Descr-column"
start-index="99" stop-index="132">
+ <owner name="col2" start-index="99" stop-index="102"/>
+ </column-projection>
+ </projections>
+ <order-by>
+ <column-item name="name" start-index="250" stop-index="258">
+ <owner name="obj1" start-index="250" stop-index="253"/>
+ </column-item>
+ <column-item name="name" start-index="261" stop-index="269">
+ <owner name="col2" start-index="261" stop-index="264"/>
+ </column-item>
+ </order-by>
+ </select>
+
+ <select sql-case-id="select_with_cross_apply">
+ <from>
+ <join-table join-type="CROSS">
+ <left>
+ <simple-table name="dm_exec_requests" alias="r"
start-index="122" stop-index="143">
+ <owner name="sys" start-index="122" stop-index="124"/>
+ </simple-table>
+ </left>
+ <right>
+ <function-table table-alias="a">
+ <table-function function-name="sys.dm_exec_sql_text"
text="sys.dm_exec_sql_text(r.sql_handle)"/>
+ </function-table>
+ </right>
+ </join-table>
+ </from>
+ <projections start-index="7" stop-index="115">
+ <column-projection name="text" alias="query" start-index="7"
stop-index="20">
+ <owner name="a" start-index="15" stop-index="15"/>
+ </column-projection>
+ <column-projection name="start_time" start-index="23"
stop-index="32"/>
+ <column-projection name="percent_complete" start-index="35"
stop-index="50"/>
+ <expression-projection
text="dateadd(second,estimated_completion_time/1000, getdate())" alias="eta"
start-index="53" stop-index="115">
+ <expr>
+ <function function-name="dateadd"
text="dateadd(second,estimated_completion_time/1000, getdate())"
start-index="59" stop-index="115">
+ <parameter>
+ <column name="second" start-index="67"
stop-index="72"/>
+ </parameter>
+ <parameter>
+ <binary-operation-expression start-index="74"
stop-index="103" text="estimated_completion_time/1000">
+ <left>
+ <column name="estimated_completion_time"
start-index="74" stop-index="98"/>
+ </left>
+ <operator>/</operator>
+ <right>
+ <literal-expression value="1000"
start-index="100" stop-index="103"/>
+ </right>
+ </binary-operation-expression>
+ </parameter>
+ <parameter>
+ <function function-name="getdate" text="getdate()"
start-index="106" stop-index="114"/>
+ </parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ <where start-index="194" stop-index="229">
+ <expr>
+ <binary-operation-expression text="r.command = 'RESTORE
DATABASE'" start-index="200" stop-index="229">
+ <left>
+ <column name="command" start-index="200"
stop-index="208">
+ <owner name="r" start-index="200"
stop-index="200"/>
+ </column>
+ </left>
+ <operator>=</operator>
+ <right>
+ <literal-expression value="RESTORE DATABASE"
start-index="212" stop-index="229"/>
+ </right>
+ </binary-operation-expression>
+ </expr>
+ </where>
+ </select>
</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 290b3cc1226..7bca7b58766 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
@@ -106,5 +106,6 @@
<sql-case id="insert_with_nchar_1" value="INSERT INTO dbo.T1 VALUES (1,
N'Natalia')" db-types="SQLServer"/>
<sql-case id="insert_with_nchar_2" value="INSERT INTO dbo.T1 VALUES (2,
N'Mark')" db-types="SQLServer"/>
<sql-case id="insert_with_nchar_3" value="INSERT INTO dbo.T1 VALUES (3,
N'Randolph')" db-types="SQLServer"/>
+ <sql-case id="insert_with_batch_nchar" value="INSERT INTO
TestSchema.Employees (Name, Location) VALUES (N'Jared', N'Australia'),
(N'Nikita', N'India'), (N'Tom', N'Germany')" db-types="SQLServer"/>
<sql-case id="insert_with_data_base_name" value="INSERT INTO
AdventureWorks2022.dbo.VariableTest(Col1) VALUES('$(tablename)')"
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 885b7d41f48..57c41287696 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
@@ -232,4 +232,7 @@
<sql-case id="select_with_user_updatable_columns" value="SELECT
column_name, updatable FROM user_updatable_columns WHERE table_name =
'LOCATIONS_VIEW' ORDER BY column_name, updatable" db-types="Oracle" />
<sql-case id="select_with_script_variables" value="SELECT x.$(ColumnName)
FROM Person.Person x WHERE x.BusinessEntityID > 5" db-types="SQLServer" />
<sql-case id="select_not_expression" value="select !0,NOT 0=1,!(0=0),1 AND
1,1 && 0,0 OR 1,1 || NULL, 1=1 or 1=1 and 1=0" db-types="MySQL" />
+ <sql-case id="select_with_count_temp_table" value="SELECT COUNT(*) AS
[Number of rows] FROM #Test" db-types="SQLServer"/>
+ <sql-case id="select_with_bracket_alias" value="SELECT obj1.name AS
[XEvent-name], col2.name AS [XEvent-column], obj1.description AS [Descr-name],
col2.description AS [Descr-column] FROM sys.dm_xe_objects AS obj1 INNER JOIN
sys.dm_xe_object_columns AS col2 ON col2.object_name = obj1.name ORDER BY
obj1.name, col2.name" db-types="SQLServer"/>
+ <sql-case id="select_with_cross_apply" value="SELECT query = a.text,
start_time, percent_complete, eta =
dateadd(second,estimated_completion_time/1000, getdate()) FROM
sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) a WHERE
r.command = 'RESTORE DATABASE'" db-types="SQLServer"/>
</sql-cases>