This is an automated email from the ASF dual-hosted git repository.
wuweijie 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 8a8fbebb382 Fix values statement ClassCastException (#26686)
8a8fbebb382 is described below
commit 8a8fbebb382a152bc11bc6f84c20b0c31d1c7062
Author: niu niu <[email protected]>
AuthorDate: Thu Jul 6 21:33:40 2023 +0800
Fix values statement ClassCastException (#26686)
* Fix values statement ClassCastException
* Fix code
* Add values statement E2E
* Add parse values statement
* Add test sql
* Add values statement e2e comment
* Fix comment
---
.../visitor/statement/MySQLStatementVisitor.java | 23 ++++
.../common/segment/dml/expr/ValuesExpression.java | 39 +++++++
.../dql/dql-integration-select-expression.xml | 10 ++
.../segment/expression/ExpressionAssert.java | 21 ++++
.../jaxb/segment/impl/expr/ExpectedExpression.java | 3 +
.../impl/expr/ExpectedValuesExpression.java | 36 ++++++
.../parser/src/main/resources/case/dml/values.xml | 123 +++++++++++++++++++++
.../main/resources/sql/supported/dml/values.xml | 23 ++++
8 files changed, 278 insertions(+)
diff --git
a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java
b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java
index 3c7ca700856..8fe5fcd4f2b 100644
---
a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java
+++
b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java
@@ -103,10 +103,12 @@ import
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.QueryEx
import
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.QueryExpressionParensContext;
import
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.QueryPrimaryContext;
import
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.QuerySpecificationContext;
+import
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.TableValueConstructorContext;
import
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.RegularFunctionContext;
import
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ReplaceContext;
import
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ReplaceSelectClauseContext;
import
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ReplaceValuesClauseContext;
+import
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.RowConstructorListContext;
import
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.SchemaNameContext;
import
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.SelectContext;
import
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.SelectSpecificationContext;
@@ -171,6 +173,7 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.Function
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.InExpression;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ListExpression;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.NotExpression;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ValuesExpression;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.complex.CommonExpressionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
@@ -782,6 +785,26 @@ public abstract class MySQLStatementVisitor extends
MySQLStatementBaseVisitor<AS
return result;
}
+ @Override
+ public ASTNode visitTableValueConstructor(final
TableValueConstructorContext ctx) {
+ MySQLSelectStatement result = new MySQLSelectStatement();
+ int startIndex = ctx.getStart().getStartIndex();
+ int stopIndex = ctx.getStop().getStopIndex();
+ ValuesExpression valuesExpression = new ValuesExpression(startIndex,
stopIndex);
+
valuesExpression.getRowConstructorList().addAll(createRowConstructorList(ctx.rowConstructorList()));
+ result.setProjections(new ProjectionsSegment(startIndex, stopIndex));
+ result.getProjections().getProjections().add(new
ExpressionProjectionSegment(startIndex, stopIndex, getOriginalText(ctx),
valuesExpression));
+ return result;
+ }
+
+ private Collection<InsertValuesSegment> createRowConstructorList(final
RowConstructorListContext ctx) {
+ Collection<InsertValuesSegment> result = new LinkedList<>();
+ for (AssignmentValuesContext each : ctx.assignmentValues()) {
+ result.add((InsertValuesSegment) visit(each));
+ }
+ return result;
+ }
+
@Override
public ASTNode visitTableStatement(final TableStatementContext ctx) {
MySQLSelectStatement result = new MySQLSelectStatement();
diff --git
a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/ValuesExpression.java
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/ValuesExpression.java
new file mode 100644
index 00000000000..5d9b7aeb51a
--- /dev/null
+++
b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/ValuesExpression.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.InsertValuesSegment;
+
+import java.util.Collection;
+import java.util.LinkedList;
+
+/**
+ * Values expression.
+ */
+@RequiredArgsConstructor
+@Getter
+public final class ValuesExpression implements ExpressionSegment {
+
+ private final int startIndex;
+
+ private final int stopIndex;
+
+ private final Collection<InsertValuesSegment> rowConstructorList = new
LinkedList<>();
+}
diff --git
a/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select-expression.xml
b/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select-expression.xml
index fd532489b0a..75c81459493 100644
---
a/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select-expression.xml
+++
b/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select-expression.xml
@@ -117,4 +117,14 @@
<test-case sql="SELECT n.nspname as "Schema", c.relname as
"Name", CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view'
WHEN 'i' THEN 'index' WHEN 'I' THEN 'global partition index' WHEN 'S' THEN
'sequence' WHEN 'L' THEN 'large sequence' WHEN 'f' THEN 'foreign table' WHEN
'm' THEN 'materialized view' WHEN 'e' THEN 'stream' WHEN 'o' THEN 'contview'
END as "Type", pg_catalog.pg_get_userbyid(c.relowner) as
"Owner", c.reloptions as "Stora [...]
<assertion expected-data-file="select_sys_data_for_og.xml" />
</test-case>
+
+ <!-- // TODO Until test cases support enabling for specific database
version. -->
+ <!-- <test-case sql="VALUES ROW(1,1)" db-types="MySQL"
scenario-types="db,tbl,dbtbl_with_readwrite_splitting,readwrite_splitting">-->
+ <!-- <assertion />-->
+ <!-- </test-case>-->
+
+ <!-- // TODO Until test cases support enabling for specific database
version. -->
+ <!-- <test-case sql="VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8) ORDER
BY column_1 desc, column_0 desc limit ?" db-types="MySQL"
scenario-types="db,tbl,dbtbl_with_readwrite_splitting,readwrite_splitting">-->
+ <!-- <assertion parameters="10:int" />-->
+ <!-- </test-case>-->
</integration-test-cases>
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/expression/ExpressionAssert.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/expression/ExpressionAssert.java
index a956b7918da..10fa5f77655 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/expression/ExpressionAssert.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/expression/ExpressionAssert.java
@@ -32,6 +32,7 @@ import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.InExpres
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ListExpression;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.NotExpression;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.TypeCastExpression;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ValuesExpression;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.complex.CommonExpressionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.complex.ComplexExpressionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
@@ -45,6 +46,7 @@ import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAsse
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.SQLSegmentAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.column.ColumnAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.generic.DataTypeAssert;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.insert.InsertValuesClauseAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.owner.OwnerAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.projection.ProjectionAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.dml.impl.SelectStatementAssert;
@@ -59,6 +61,7 @@ import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.s
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.ExpectedNotExpression;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.ExpectedTypeCastExpression;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.ExpectedVariableSegment;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.ExpectedValuesExpression;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.complex.ExpectedCommonExpression;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.simple.ExpectedLiteralExpression;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.simple.ExpectedParameterMarkerExpression;
@@ -70,8 +73,10 @@ import java.util.Iterator;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* Expression assert.
@@ -372,6 +377,20 @@ public final class ExpressionAssert {
assertThat(assertContext.getText("Actual variable is different with
expected variable."), actual.getVariable(), is(expected.getVariable()));
}
+ private static void assertValuesExpression(final SQLCaseAssertContext
assertContext, final ValuesExpression actual, final ExpectedValuesExpression
expected) {
+ if (null == expected) {
+ assertNull(actual, assertContext.getText("Variable segment should
not exist."));
+ return;
+ }
+ assertNotNull(actual, assertContext.getText("Variable segment should
exist."));
+ if (null == expected.getInsertValuesClause()) {
+ assertTrue(actual.getRowConstructorList().isEmpty(), "Values
expression should not exist.");
+ } else {
+ assertFalse(actual.getRowConstructorList().isEmpty(),
assertContext.getText("Values expression should exist."));
+ InsertValuesClauseAssert.assertIs(assertContext,
actual.getRowConstructorList(), expected.getInsertValuesClause());
+ }
+ }
+
/**
* Assert expression by actual expression segment class type.
*
@@ -425,6 +444,8 @@ public final class ExpressionAssert {
assertTypeCastExpression(assertContext, (TypeCastExpression)
actual, expected.getTypeCastExpression());
} else if (actual instanceof VariableSegment) {
assertVariableSegment(assertContext, (VariableSegment) actual,
expected.getVariableSegment());
+ } else if (actual instanceof ValuesExpression) {
+ assertValuesExpression(assertContext, (ValuesExpression) actual,
expected.getValuesExpression());
} else {
throw new UnsupportedOperationException(String.format("Unsupported
expression: %s", actual.getClass().getName()));
}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedExpression.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedExpression.java
index 032c17e8192..c8b4cd6bf3e 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedExpression.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedExpression.java
@@ -95,4 +95,7 @@ public final class ExpectedExpression extends
AbstractExpectedSQLSegment {
@XmlElement(name = "variable-segment")
private ExpectedVariableSegment variableSegment;
+
+ @XmlElement(name = "values-expression")
+ private ExpectedValuesExpression valuesExpression;
}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedValuesExpression.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedValuesExpression.java
new file mode 100644
index 00000000000..7fbced828d6
--- /dev/null
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedValuesExpression.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr;
+
+import lombok.Getter;
+import lombok.Setter;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedSQLSegment;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.insert.ExpectedInsertValuesClause;
+
+import javax.xml.bind.annotation.XmlElement;
+
+/**
+ * Expected values expression.
+ */
+@Getter
+@Setter
+public final class ExpectedValuesExpression extends AbstractExpectedSQLSegment
{
+
+ @XmlElement(name = "values")
+ private ExpectedInsertValuesClause insertValuesClause;
+}
diff --git a/test/it/parser/src/main/resources/case/dml/values.xml
b/test/it/parser/src/main/resources/case/dml/values.xml
new file mode 100644
index 00000000000..0d7b2e5d1cc
--- /dev/null
+++ b/test/it/parser/src/main/resources/case/dml/values.xml
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one or more
+ ~ contributor license agreements. See the NOTICE file distributed with
+ ~ this work for additional information regarding copyright ownership.
+ ~ The ASF licenses this file to You under the Apache License, Version 2.0
+ ~ (the "License"); you may not use this file except in compliance with
+ ~ the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+
+<sql-parser-test-cases>
+ <select sql-case-id="values_with_row">
+ <projections start-index="0" stop-index="14">
+ <expression-projection text="values ROW(1,2)" start-index="0"
stop-index="14">
+ <expr>
+ <values-expression>
+ <values>
+ <value>
+ <assignment-value>
+ <literal-expression value="1"
start-index="11" stop-index="11" />
+ </assignment-value>
+ <assignment-value>
+ <literal-expression value="2"
start-index="13" stop-index="13" />
+ </assignment-value>
+ </value>
+ </values>
+ </values-expression>
+ </expr>
+ </expression-projection>
+ </projections>
+ </select>
+
+ <select sql-case-id="values_with_order_limit">
+ <projections start-index="0" stop-index="41">
+ <expression-projection text="VALUES ROW(1,-2,3), ROW(5,7,9),
ROW(4,6,8)" start-index="0" stop-index="41">
+ <expr>
+ <values-expression>
+ <values>
+ <value>
+ <assignment-value>
+ <literal-expression value="1"
start-index="11" stop-index="11" />
+ </assignment-value>
+ <assignment-value>
+ <literal-expression value="-2"
start-index="13" stop-index="14" />
+ </assignment-value>
+ <assignment-value>
+ <literal-expression value="3"
start-index="16" stop-index="16" />
+ </assignment-value>
+ </value>
+ <value>
+ <assignment-value>
+ <literal-expression value="5"
start-index="24" stop-index="24" />
+ </assignment-value>
+ <assignment-value>
+ <literal-expression value="7"
start-index="26" stop-index="26" />
+ </assignment-value>
+ <assignment-value>
+ <literal-expression value="9"
start-index="28" stop-index="28" />
+ </assignment-value>
+ </value>
+ <value>
+ <assignment-value>
+ <literal-expression value="4"
start-index="36" stop-index="36" />
+ </assignment-value>
+ <assignment-value>
+ <literal-expression value="6"
start-index="38" stop-index="38" />
+ </assignment-value>
+ <assignment-value>
+ <literal-expression value="8"
start-index="40" stop-index="40" />
+ </assignment-value>
+ </value>
+ </values>
+ </values-expression>
+ </expr>
+ </expression-projection>
+ </projections>
+ <order-by>
+ <column-item name="column_1" order-direction="DESC"
start-index="52" stop-index="59" />
+ <column-item name="column_0" order-direction="DESC"
start-index="68" stop-index="75" />
+ </order-by>
+ <limit start-index="82" stop-index="89">
+ <row-count value="10" start-index="88" stop-index="89" />
+ </limit>
+ </select>
+
+ <select sql-case-id="values_with_select">
+ <projections start-index="0" stop-index="24">
+ <expression-projection text="values row((select 1), 2)"
start-index="0" stop-index="24">
+ <expr>
+ <values-expression>
+ <values>
+ <value>
+ <assignment-value>
+ <subquery start-index="11" stop-index="20">
+ <select>
+ <projections start-index="19"
stop-index="19">
+ <expression-projection
text="1" start-index="19" stop-index="19">
+ <literal-expression
value="1" start-index="19" stop-index="19" />
+ </expression-projection>
+ </projections>
+ </select>
+ </subquery>
+ </assignment-value>
+ <assignment-value>
+ <literal-expression value="2"
start-index="23" stop-index="23" />
+ </assignment-value>
+ </value>
+ </values>
+ </values-expression>
+ </expr>
+ </expression-projection>
+ </projections>
+ </select>
+</sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/values.xml
b/test/it/parser/src/main/resources/sql/supported/dml/values.xml
new file mode 100644
index 00000000000..bb31b244693
--- /dev/null
+++ b/test/it/parser/src/main/resources/sql/supported/dml/values.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one or more
+ ~ contributor license agreements. See the NOTICE file distributed with
+ ~ this work for additional information regarding copyright ownership.
+ ~ The ASF licenses this file to You under the Apache License, Version 2.0
+ ~ (the "License"); you may not use this file except in compliance with
+ ~ the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<sql-cases>
+ <sql-case id="values_with_row" value="values ROW(1,2)" db-types="MySQL" />
+ <sql-case id="values_with_order_limit" value="VALUES ROW(1,-2,3),
ROW(5,7,9), ROW(4,6,8) ORDER BY column_1 desc , column_0 desc limit 10"
db-types="MySQL" />
+ <sql-case id="values_with_select" value="values row((select 1), 2)"
db-types="MySQL" />
+</sql-cases>