Skip to content

Commit

Permalink
Test function consistency by comparing Calcite against reference values
Browse files Browse the repository at this point in the history
Add option to bypass Calcite and execute statement using the raw ResultSet.
  • Loading branch information
zabetak committed Feb 26, 2024
1 parent f18d884 commit 4af9554
Showing 1 changed file with 45 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.apache.calcite.test;

import org.junit.jupiter.api.AfterAll;
Expand All @@ -37,6 +36,10 @@
import java.util.Map;

public class DBFunctionConsistencyTest {

Check failure on line 38 in core/src/test/java/org/apache/calcite/test/DBFunctionConsistencyTest.java

View workflow job for this annotation

GitHub Actions / Linux (JDK 19)

[Task :core:checkstyleTest] [MissingJavadocType] Missing a Javadoc comment.

Check failure on line 38 in core/src/test/java/org/apache/calcite/test/DBFunctionConsistencyTest.java

View workflow job for this annotation

GitHub Actions / Linux (JDK 17)

[Task :core:checkstyleTest] [MissingJavadocType] Missing a Javadoc comment.

Check failure on line 38 in core/src/test/java/org/apache/calcite/test/DBFunctionConsistencyTest.java

View workflow job for this annotation

GitHub Actions / Linux (JDK 11), Pacific/Chatham Timezone

[Task :core:checkstyleTest] [MissingJavadocType] Missing a Javadoc comment.

Check failure on line 38 in core/src/test/java/org/apache/calcite/test/DBFunctionConsistencyTest.java

View workflow job for this annotation

GitHub Actions / Linux (JDK 8), oldest Guava, America/New_York Timezone

[Task :core:checkstyleTest] [MissingJavadocType] Missing a Javadoc comment.

Check failure on line 38 in core/src/test/java/org/apache/calcite/test/DBFunctionConsistencyTest.java

View workflow job for this annotation

GitHub Actions / Linux (JDK 11), Avatica main

[Task :core:checkstyleTest] [MissingJavadocType] Missing a Javadoc comment.

Check failure on line 38 in core/src/test/java/org/apache/calcite/test/DBFunctionConsistencyTest.java

View workflow job for this annotation

GitHub Actions / Linux (JDK 8), latest Guava, America/New_York Timezone

[Task :core:checkstyleTest] [MissingJavadocType] Missing a Javadoc comment.

Check failure on line 38 in core/src/test/java/org/apache/calcite/test/DBFunctionConsistencyTest.java

View workflow job for this annotation

GitHub Actions / macOS (JDK 19)

[Task :core:checkstyleTest] [MissingJavadocType] Missing a Javadoc comment.
/**
* Whether to execute a statement using a raw JDBC connection or via Calcite.
*/
private static final Boolean USE_RAW_JDBC_CONNECTION = false;

private enum Type {

Check failure on line 44 in core/src/test/java/org/apache/calcite/test/DBFunctionConsistencyTest.java

View workflow job for this annotation

GitHub Actions / Linux (JDK 19)

[Task :core:checkstyleTest] [MissingJavadocType] Missing a Javadoc comment.

Check failure on line 44 in core/src/test/java/org/apache/calcite/test/DBFunctionConsistencyTest.java

View workflow job for this annotation

GitHub Actions / Linux (JDK 17)

[Task :core:checkstyleTest] [MissingJavadocType] Missing a Javadoc comment.

Check failure on line 44 in core/src/test/java/org/apache/calcite/test/DBFunctionConsistencyTest.java

View workflow job for this annotation

GitHub Actions / Linux (JDK 11), Pacific/Chatham Timezone

[Task :core:checkstyleTest] [MissingJavadocType] Missing a Javadoc comment.

Check failure on line 44 in core/src/test/java/org/apache/calcite/test/DBFunctionConsistencyTest.java

View workflow job for this annotation

GitHub Actions / Linux (JDK 8), oldest Guava, America/New_York Timezone

[Task :core:checkstyleTest] [MissingJavadocType] Missing a Javadoc comment.

Check failure on line 44 in core/src/test/java/org/apache/calcite/test/DBFunctionConsistencyTest.java

View workflow job for this annotation

GitHub Actions / Linux (JDK 11), Avatica main

[Task :core:checkstyleTest] [MissingJavadocType] Missing a Javadoc comment.

Check failure on line 44 in core/src/test/java/org/apache/calcite/test/DBFunctionConsistencyTest.java

View workflow job for this annotation

GitHub Actions / Linux (JDK 8), latest Guava, America/New_York Timezone

[Task :core:checkstyleTest] [MissingJavadocType] Missing a Javadoc comment.

Check failure on line 44 in core/src/test/java/org/apache/calcite/test/DBFunctionConsistencyTest.java

View workflow job for this annotation

GitHub Actions / macOS (JDK 19)

[Task :core:checkstyleTest] [MissingJavadocType] Missing a Javadoc comment.
ORACLE {
Expand All @@ -57,7 +60,8 @@ private static Map<Type, JdbcDatabaseContainer<?>> initContainers() {
dbs.put(Type.POSTGRES_9_6, new PostgreSQLContainer<>("postgres:9.6"));
dbs.put(Type.POSTGRES_12_2, new PostgreSQLContainer<>("postgres:12.2"));
dbs.put(Type.MYSQL, new MySQLContainer<>());
dbs.put(Type.ORACLE, new OracleContainer(
dbs.put(
Type.ORACLE, new OracleContainer(
"gvenzl/oracle-xe:21-slim-faststart"));
return dbs;
}
Expand All @@ -74,46 +78,56 @@ static void teardown() {

@ParameterizedTest
@CsvSource({
"SQRT(4),ORACLE",
"SQRT(4),POSTGRES_9_6",
"SQRT(4),POSTGRES_12_2",
"SQRT(4),MYSQL",
"SQRT(-1),ORACLE",
"SQRT(-1),POSTGRES_9_6",
"SQRT(-1),POSTGRES_12_2",
"SQRT(-1),MYSQL"
"SQRT(4.0),ORACLE,2",
"SQRT(4.0),POSTGRES_9_6,2.000000000000000",
"SQRT(4.0),POSTGRES_12_2,2.000000000000000",
"SQRT(4.0),MYSQL,2",
"SQRT(4),ORACLE,2",
"SQRT(4),POSTGRES_9_6,2",
"SQRT(4),POSTGRES_12_2,2",
"SQRT(4),MYSQL,2",
"SQRT(-1),ORACLE,ERROR",
"SQRT(-1),POSTGRES_9_6,ERROR",
"SQRT(-1),POSTGRES_12_2,ERROR",
"SQRT(-1),MYSQL,"
})
void testFunction(String function, String db) {
String calciteResult = execute(Type.valueOf(db), true, function);
String rawResult = execute(Type.valueOf(db), false, function);
Assertions.assertEquals(rawResult, calciteResult);
void testFunction(String function, String db, String expectedResult) {
Assertions.assertEquals(expectedResult, execute(Type.valueOf(db), function));
}

String execute(Type dbType, boolean useCalcite, String exp) {
JdbcDatabaseContainer<?> db = DBS.get(dbType);
final String url;
final String query;
if (useCalcite) {
url = String.format(
"jdbc:calcite:schemaType=JDBC; schema.jdbcUser=%s; schema.jdbcPassword=%s; schema"
+ ".jdbcUrl=%s", db.getUsername(), db.getPassword(), db.getJdbcUrl());
query = "SELECT " + exp;
} else {
url = db.getJdbcUrl();
query = dbType.query(exp);
}
try (Connection c = DriverManager.getConnection(url, db.getUsername(), db.getPassword())) {
try (PreparedStatement stmt = c.prepareStatement(query)) {
private static String execute(Type dbType, String exp) {
try (Connection c = getConnection(dbType)) {
try (PreparedStatement stmt = c.prepareStatement(query(dbType, exp))) {
try (ResultSet rs = stmt.executeQuery()) {
if (rs.next()) {
return rs.getString(1);
} else {
return "";
throw new AssertionError("NoResult");
}
}
}
} catch (Exception e) {
return e.getMessage();
return "ERROR";
}
}

private static Connection getConnection(Type dbType) throws SQLException {
JdbcDatabaseContainer<?> db = DBS.get(dbType);
if (USE_RAW_JDBC_CONNECTION) {
return DriverManager.getConnection(db.getJdbcUrl(), db.getUsername(), db.getPassword());
} else {
String calciteUrl =
String.format("jdbc:calcite:schemaType=JDBC; schema.jdbcUser=%s; schema.jdbcPassword=%s; schema"

Check failure on line 120 in core/src/test/java/org/apache/calcite/test/DBFunctionConsistencyTest.java

View workflow job for this annotation

GitHub Actions / Linux (JDK 19)

[Task :core:checkstyleTest] [LineLength] Line is longer than 100 characters (found 106).

Check failure on line 120 in core/src/test/java/org/apache/calcite/test/DBFunctionConsistencyTest.java

View workflow job for this annotation

GitHub Actions / Linux (JDK 17)

[Task :core:checkstyleTest] [LineLength] Line is longer than 100 characters (found 106).

Check failure on line 120 in core/src/test/java/org/apache/calcite/test/DBFunctionConsistencyTest.java

View workflow job for this annotation

GitHub Actions / Linux (JDK 11), Pacific/Chatham Timezone

[Task :core:checkstyleTest] [LineLength] Line is longer than 100 characters (found 106).

Check failure on line 120 in core/src/test/java/org/apache/calcite/test/DBFunctionConsistencyTest.java

View workflow job for this annotation

GitHub Actions / Linux (JDK 8), oldest Guava, America/New_York Timezone

[Task :core:checkstyleTest] [LineLength] Line is longer than 100 characters (found 106).

Check failure on line 120 in core/src/test/java/org/apache/calcite/test/DBFunctionConsistencyTest.java

View workflow job for this annotation

GitHub Actions / Linux (JDK 11), Avatica main

[Task :core:checkstyleTest] [LineLength] Line is longer than 100 characters (found 106).

Check failure on line 120 in core/src/test/java/org/apache/calcite/test/DBFunctionConsistencyTest.java

View workflow job for this annotation

GitHub Actions / Linux (JDK 8), latest Guava, America/New_York Timezone

[Task :core:checkstyleTest] [LineLength] Line is longer than 100 characters (found 106).

Check failure on line 120 in core/src/test/java/org/apache/calcite/test/DBFunctionConsistencyTest.java

View workflow job for this annotation

GitHub Actions / macOS (JDK 19)

[Task :core:checkstyleTest] [LineLength] Line is longer than 100 characters (found 106).
+ ".jdbcUrl=%s", db.getUsername(), db.getPassword(), db.getJdbcUrl());
return DriverManager.getConnection(calciteUrl);
}
}

private static String query(Type dbType, String exp) {
if (USE_RAW_JDBC_CONNECTION) {
return dbType.query(exp);
} else {
return "SELECT " + exp;
}
}
}

0 comments on commit 4af9554

Please sign in to comment.