This is an automated email from the ASF dual-hosted git repository.
jhyde pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push:
new e92a5fcaba [CALCITE-5611] In SqlOperatorTest, show SQL for failed tests
e92a5fcaba is described below
commit e92a5fcaba2db7416f09331614985b6ca2d7e6a3
Author: Sergey Nuyanzin <[email protected]>
AuthorDate: Sun Mar 26 20:48:44 2023 +0200
[CALCITE-5611] In SqlOperatorTest, show SQL for failed tests
Close apache/calcite#3131
---
.../apache/calcite/sql/test/AbstractSqlTester.java | 2 +-
.../apache/calcite/sql/test/ResultCheckers.java | 52 ++++++++++++----------
.../org/apache/calcite/sql/test/SqlTester.java | 5 ++-
.../java/org/apache/calcite/sql/test/SqlTests.java | 13 +++---
.../calcite/test/SqlOperatorFixtureImpl.java | 2 +-
.../org/apache/calcite/test/SqlOperatorTest.java | 8 ++--
.../java/org/apache/calcite/test/FixtureTest.java | 12 ++---
7 files changed, 50 insertions(+), 44 deletions(-)
diff --git
a/testkit/src/main/java/org/apache/calcite/sql/test/AbstractSqlTester.java
b/testkit/src/main/java/org/apache/calcite/sql/test/AbstractSqlTester.java
index d68b381cba..8f5defe162 100644
--- a/testkit/src/main/java/org/apache/calcite/sql/test/AbstractSqlTester.java
+++ b/testkit/src/main/java/org/apache/calcite/sql/test/AbstractSqlTester.java
@@ -234,7 +234,7 @@ public abstract class AbstractSqlTester implements
SqlTester, AutoCloseable {
RelDataType actualType = getColumnType(factory, query);
// Check result type.
- typeChecker.checkType(actualType);
+ typeChecker.checkType(() -> "Query: " + query, actualType);
Pair<SqlValidator, SqlNode> p = parseAndValidate(factory, query);
SqlValidator validator = requireNonNull(p.left);
diff --git
a/testkit/src/main/java/org/apache/calcite/sql/test/ResultCheckers.java
b/testkit/src/main/java/org/apache/calcite/sql/test/ResultCheckers.java
index 69fad877f1..3ecf527b9e 100644
--- a/testkit/src/main/java/org/apache/calcite/sql/test/ResultCheckers.java
+++ b/testkit/src/main/java/org/apache/calcite/sql/test/ResultCheckers.java
@@ -114,15 +114,17 @@ public class ResultCheckers {
* Compares the first column of a result set against a String-valued
* reference set, disregarding order entirely.
*
+ * @param sql SQL to show in case of failure
* @param resultSet Result set
* @param refSet Expected results
* @throws Exception .
*/
- static void compareResultSet(ResultSet resultSet,
+ static void compareResultSet(String sql, ResultSet resultSet,
Set<String> refSet) throws Exception {
Set<String> actualSet = new HashSet<>();
final int columnType = resultSet.getMetaData().getColumnType(1);
final ColumnMetaData.Rep rep = rep(columnType);
+ final String msg = "Query: " + sql;
while (resultSet.next()) {
final String s = resultSet.getString(1);
final String s0 = s == null ? "0" : s;
@@ -131,7 +133,7 @@ public class ResultCheckers {
switch (rep) {
case BOOLEAN:
case PRIMITIVE_BOOLEAN:
- assertThat(resultSet.getBoolean(1), equalTo(Boolean.valueOf(s)));
+ assertThat(msg, resultSet.getBoolean(1), equalTo(Boolean.valueOf(s)));
break;
case BYTE:
case PRIMITIVE_BYTE:
@@ -148,18 +150,18 @@ public class ResultCheckers {
// Large integers come out in scientific format, say "5E+06"
l = (long) Double.parseDouble(s0);
}
- assertThat(resultSet.getByte(1), equalTo((byte) l));
- assertThat(resultSet.getShort(1), equalTo((short) l));
- assertThat(resultSet.getInt(1), equalTo((int) l));
- assertThat(resultSet.getLong(1), equalTo(l));
+ assertThat(msg, resultSet.getByte(1), equalTo((byte) l));
+ assertThat(msg, resultSet.getShort(1), equalTo((short) l));
+ assertThat(msg, resultSet.getInt(1), equalTo((int) l));
+ assertThat(msg, resultSet.getLong(1), equalTo(l));
break;
case FLOAT:
case PRIMITIVE_FLOAT:
case DOUBLE:
case PRIMITIVE_DOUBLE:
final double d = Double.parseDouble(s0);
- assertThat(resultSet.getFloat(1), equalTo((float) d));
- assertThat(resultSet.getDouble(1), equalTo(d));
+ assertThat(msg, resultSet.getFloat(1), equalTo((float) d));
+ assertThat(msg, resultSet.getDouble(1), equalTo(d));
break;
default:
// fall through; no type-specific validation is necessary
@@ -167,12 +169,12 @@ public class ResultCheckers {
final boolean wasNull1 = resultSet.wasNull();
final Object object = resultSet.getObject(1);
final boolean wasNull2 = resultSet.wasNull();
- assertThat(object == null, equalTo(wasNull0));
- assertThat(wasNull1, equalTo(wasNull0));
- assertThat(wasNull2, equalTo(wasNull0));
+ assertThat(msg, object == null, equalTo(wasNull0));
+ assertThat(msg, wasNull1, equalTo(wasNull0));
+ assertThat(msg, wasNull2, equalTo(wasNull0));
}
resultSet.close();
- assertEquals(refSet, actualSet);
+ assertEquals(refSet, actualSet, msg);
}
private static ColumnMetaData.Rep rep(int columnType) {
@@ -206,20 +208,21 @@ public class ResultCheckers {
* Compares the first column of a result set against a pattern. The result
* set must return exactly one row.
*
+ * @param sql SQL to show in case of failure
* @param resultSet Result set
* @param pattern Expected pattern
*/
- static void compareResultSetWithPattern(ResultSet resultSet,
+ static void compareResultSetWithPattern(String sql, ResultSet resultSet,
Pattern pattern) throws Exception {
if (!resultSet.next()) {
- fail("Query returned 0 rows, expected 1");
+ fail("Query \"" + sql + "\"returned 0 rows, expected 1");
}
String actual = resultSet.getString(1);
if (resultSet.next()) {
- fail("Query returned 2 or more rows, expected 1");
+ fail("Query \"" + sql + "\"returned 2 or more rows, expected 1");
}
if (!pattern.matcher(actual).matches()) {
- fail("Query returned '"
+ fail("Query \"" + sql + "\"returned '"
+ actual
+ "', expected '"
+ pattern.pattern()
@@ -231,12 +234,13 @@ public class ResultCheckers {
* Compares the first column of a result set against a {@link Matcher}.
* The result set must return exactly one row.
*
+ * @param sql SQL to show in case of failure
* @param resultSet Result set
* @param matcher Matcher
*
* @param <T> Value type
*/
- static <T> void compareResultSetWithMatcher(ResultSet resultSet,
+ static <T> void compareResultSetWithMatcher(String sql, ResultSet resultSet,
JdbcType<T> jdbcType, Matcher<T> matcher) throws Exception {
if (!resultSet.next()) {
fail("Query returned 0 rows, expected 1");
@@ -245,7 +249,7 @@ public class ResultCheckers {
if (resultSet.next()) {
fail("Query returned 2 or more rows, expected 1");
}
- assertThat(actual, matcher);
+ assertThat("Query: " + sql, actual, matcher);
}
/** Creates a ResultChecker that accesses a column of a given type
@@ -294,8 +298,8 @@ public class ResultCheckers {
this.pattern = requireNonNull(pattern, "pattern");
}
- @Override public void checkResult(ResultSet resultSet) throws Exception {
- compareResultSetWithPattern(resultSet, pattern);
+ @Override public void checkResult(String sql, ResultSet resultSet) throws
Exception {
+ compareResultSetWithPattern(sql, resultSet, pattern);
}
}
@@ -313,8 +317,8 @@ public class ResultCheckers {
this.jdbcType = requireNonNull(jdbcType, "jdbcType");
}
- @Override public void checkResult(ResultSet resultSet) throws Exception {
- compareResultSetWithMatcher(resultSet, jdbcType, matcher);
+ @Override public void checkResult(String sql, ResultSet resultSet) throws
Exception {
+ compareResultSetWithMatcher(sql, resultSet, jdbcType, matcher);
}
}
@@ -328,8 +332,8 @@ public class ResultCheckers {
this.expected = ImmutableNullableSet.copyOf(expected);
}
- @Override public void checkResult(ResultSet resultSet) throws Exception {
- compareResultSet(resultSet, expected);
+ @Override public void checkResult(String sql, ResultSet resultSet) throws
Exception {
+ compareResultSet(sql, resultSet, expected);
}
}
}
diff --git a/testkit/src/main/java/org/apache/calcite/sql/test/SqlTester.java
b/testkit/src/main/java/org/apache/calcite/sql/test/SqlTester.java
index c8c76556b6..19365ce94f 100644
--- a/testkit/src/main/java/org/apache/calcite/sql/test/SqlTester.java
+++ b/testkit/src/main/java/org/apache/calcite/sql/test/SqlTester.java
@@ -31,6 +31,7 @@ import org.checkerframework.checker.nullness.qual.Nullable;
import java.sql.ResultSet;
import java.util.function.Consumer;
+import java.util.function.Supplier;
import static java.util.Objects.requireNonNull;
@@ -320,7 +321,7 @@ public interface SqlTester extends AutoCloseable {
/** Type checker. */
interface TypeChecker {
- void checkType(RelDataType type);
+ void checkType(Supplier<String> sql, RelDataType type);
}
/** Parameter checker. */
@@ -330,7 +331,7 @@ public interface SqlTester extends AutoCloseable {
/** Result checker. */
interface ResultChecker {
- void checkResult(ResultSet result) throws Exception;
+ void checkResult(String sql, ResultSet result) throws Exception;
}
/** Action that is called after validation.
diff --git a/testkit/src/main/java/org/apache/calcite/sql/test/SqlTests.java
b/testkit/src/main/java/org/apache/calcite/sql/test/SqlTests.java
index 01d7277833..d3712ebaeb 100644
--- a/testkit/src/main/java/org/apache/calcite/sql/test/SqlTests.java
+++ b/testkit/src/main/java/org/apache/calcite/sql/test/SqlTests.java
@@ -33,6 +33,7 @@ import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.Arrays;
import java.util.List;
+import java.util.function.Supplier;
import java.util.regex.Pattern;
import static org.apache.calcite.sql.test.SqlTester.ParameterChecker;
@@ -58,7 +59,7 @@ public abstract class SqlTests {
/**
* Checker which allows any type.
*/
- public static final TypeChecker ANY_TYPE_CHECKER = type -> {
+ public static final TypeChecker ANY_TYPE_CHECKER = (sql, type) -> {
};
/**
@@ -70,7 +71,7 @@ public abstract class SqlTests {
/**
* Checker that allows any result.
*/
- public static final ResultChecker ANY_RESULT_CHECKER = result -> {
+ public static final ResultChecker ANY_RESULT_CHECKER = (sql, result) -> {
while (true) {
if (!result.next()) {
break;
@@ -424,8 +425,8 @@ public abstract class SqlTests {
this.typeName = typeName;
}
- @Override public void checkType(RelDataType type) {
- assertThat(type.toString(), is(typeName.toString()));
+ @Override public void checkType(Supplier<String> sql, RelDataType type) {
+ assertThat(sql.get(), type.toString(), is(typeName.toString()));
}
}
@@ -450,9 +451,9 @@ public abstract class SqlTests {
this.expected = expected;
}
- @Override public void checkType(RelDataType type) {
+ @Override public void checkType(Supplier<String> sql, RelDataType type) {
String actual = getTypeString(type);
- assertThat(actual, is(expected));
+ assertThat(sql.get(), actual, is(expected));
}
}
diff --git
a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorFixtureImpl.java
b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorFixtureImpl.java
index a3232e8bdf..fcf848d8a4 100644
--- a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorFixtureImpl.java
+++ b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorFixtureImpl.java
@@ -140,7 +140,7 @@ class SqlOperatorFixtureImpl implements SqlOperatorFixture {
assertEquals(1, fields.size(), "expected query to return 1 field");
final RelDataType actualType = fields.get(0).getType();
String actual = SqlTests.getTypeString(actualType);
- assertThat(actual, matcher);
+ assertThat("Query: " + sql.sql, actual, matcher);
};
}
diff --git a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java
b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java
index ae4ff74037..42e946a4ef 100644
--- a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java
+++ b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java
@@ -10600,7 +10600,7 @@ public class SqlOperatorTest {
query = AbstractSqlTester.buildQuery(s);
}
f.check(query, SqlTests.ANY_TYPE_CHECKER,
- SqlTests.ANY_PARAMETER_CHECKER, result -> { });
+ SqlTests.ANY_PARAMETER_CHECKER, (sql, result) -> { });
}
} catch (Throwable e) {
// Logging the top-level throwable directly makes the message
@@ -10662,7 +10662,7 @@ public class SqlOperatorTest {
this.patterns = patterns;
}
- @Override public void checkResult(ResultSet result) throws Exception {
+ @Override public void checkResult(String sql, ResultSet result) throws
Exception {
Throwable thrown = null;
try {
if (!result.next()) {
@@ -10670,7 +10670,7 @@ public class SqlOperatorTest {
return;
}
final Object actual = result.getObject(1);
- assertEquals(expected, actual);
+ assertEquals(expected, actual, () -> "Query: " + sql);
} catch (SQLException e) {
thrown = e;
}
@@ -10723,7 +10723,7 @@ public class SqlOperatorTest {
Statement statement = connection.createStatement()) {
final ResultSet resultSet =
statement.executeQuery(query);
- resultChecker.checkResult(resultSet);
+ resultChecker.checkResult(query, resultSet);
} catch (Exception e) {
throw TestUtil.rethrow(e);
}
diff --git a/testkit/src/test/java/org/apache/calcite/test/FixtureTest.java
b/testkit/src/test/java/org/apache/calcite/test/FixtureTest.java
index eeb6997ff4..9e963b1c6c 100644
--- a/testkit/src/test/java/org/apache/calcite/test/FixtureTest.java
+++ b/testkit/src/test/java/org/apache/calcite/test/FixtureTest.java
@@ -95,12 +95,12 @@ public class FixtureTest {
// The fixture that executes fails, because the result value is incorrect.
validateFixture.checkBoolean("1 < 5", false);
assertFails(() -> executeFixture.checkBoolean("1 < 5", false),
- "<false>", "<true>");
+ "Query: values (1 < 5)", "<false>", "<true>");
// The fixture that executes fails, because the result value is incorrect.
validateFixture.checkScalarExact("1 + 2", "INTEGER NOT NULL", "foo");
assertFails(() -> validateFixture.checkScalarExact("1 + 2", "DATE", "foo"),
- "\"DATE\"", "\"INTEGER NOT NULL\"");
+ "Query: values (1 + 2)", "\"DATE\"", "\"INTEGER NOT NULL\"");
// Both fixtures pass.
validateFixture.checkScalarExact("1 + 2", "INTEGER NOT NULL", "3");
@@ -108,17 +108,17 @@ public class FixtureTest {
// Both fixtures fail, because the type is incorrect.
assertFails(() -> validateFixture.checkScalarExact("1 + 2", "DATE", "foo"),
- "\"DATE\"", "\"INTEGER NOT NULL\"");
+ "Query: values (1 + 2)", "\"DATE\"", "\"INTEGER NOT NULL\"");
assertFails(() -> executeFixture.checkScalarExact("1 + 2", "DATE", "foo"),
- "\"DATE\"", "\"INTEGER NOT NULL\"");
+ "Query: values (1 + 2)", "\"DATE\"", "\"INTEGER NOT NULL\"");
}
- static void assertFails(Runnable runnable, String expected, String actual) {
+ static void assertFails(Runnable runnable, String msg, String expected,
String actual) {
try {
runnable.run();
fail("expected error");
} catch (AssertionError e) {
- String expectedMessage = "\n"
+ String expectedMessage = msg + "\n"
+ "Expected: is " + expected + "\n"
+ " but: was " + actual;
assertThat(e.getMessage(), is(expectedMessage));