Files
dolthub--doltgresql/testing/postgres-client-tests/java/PostgresTest.java
T
2026-07-13 12:32:25 +08:00

135 lines
6.4 KiB
Java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
public class PostgresTest {
public String query;
public Integer expectedUpdateCount; // for queries that don't return set of results
public Object fieldAccessor; // can be String (i.e column name), Integer (i.e. field position) and `null` for no result set queries.
public String[] expectedResults;
// Parameterized constructor
public PostgresTest(String query, Integer expectedUpdateCount, Object fieldAccessor, String[] expectedResults) {
this.query = query;
this.expectedUpdateCount = expectedUpdateCount;
this.fieldAccessor = fieldAccessor;
this.expectedResults = expectedResults;
}
// Getters and Setters (optional)
public String getQuery() {
return this.query;
}
public Integer getExpectedUpdateCount() {
return this.expectedUpdateCount;
}
public Object getFieldAccessor() {
return this.fieldAccessor;
}
public String[] getExpectedResults() {
return this.expectedResults;
}
// test queries to be run against Doltgres
private static final PostgresTest[] tests = {
new PostgresTest("create table test (pk int, value int, d1 decimal(4,2), c1 char(10), primary key(pk))", 0, null, null),
new PostgresTest("select pk from test", null, "pk", new String[]{}), // the table has no rows
new PostgresTest("insert into test (pk, value, d1, c1) values (0,1,2.3,'hi'), (2,3,4.56,'hello')", 2, null, null),
new PostgresTest("select * from test", null, "pk", new String[]{"0","2"}),
new PostgresTest("select * from test", null, "value", new String[]{"1","3"}),
// TODO: doltgres DECIMAL type result is returned as "2.3", should be "2.30"
// new PostgresTest("select * from test", null, "d1", new String[]{"2.30","4.56"}),
new PostgresTest("select * from test", null, "c1", new String[]{"hi ","hello "}),
new PostgresTest("select dolt_add('-A')", null, "dolt_add", new String[]{"{0}"}),
new PostgresTest("select length(dolt_commit('-m', 'my commit')::text)", null, 1, new String[]{"34"}),
new PostgresTest("select COUNT(*) FROM dolt.log", null, 1, new String[]{"3"}),
new PostgresTest("select dolt_checkout('-b', 'mybranch')", null, "dolt_checkout", new String[]{"{0,\"Switched to branch 'mybranch'\"}"}),
new PostgresTest("insert into test (pk, value, d1, c1) values (1,1,12.34,'bye')", 1, null, null),
new PostgresTest("select length(dolt_commit('-a', '-m', 'my commit2')::text)", null, 1, new String[]{"34"}),
new PostgresTest("select dolt_checkout('main')", null, "dolt_checkout", new String[]{"{0,\"Switched to branch 'main'\"}"}),
new PostgresTest("select length(dolt_merge('mybranch')::text)", null, 1, new String[]{"57"}),
new PostgresTest("select COUNT(*) FROM dolt.log", null, "COUNT", new String[]{"4"}), // returns res
};
public static void main(String[] args) {
Connection conn = null;
String user = args[0];
String port = args[1];
try {
String url = "jdbc:postgresql://127.0.0.1:" + port + "/postgres";
String password = "password";
conn = DriverManager.getConnection(url, user, password);
Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
for (int i = 0; i < tests.length; i++) {
PostgresTest t = tests[i];
String query = t.getQuery();
if ( st.execute(query) ) {
String[] expectedResults = t.getExpectedResults();
Object fieldAccessor = t.getFieldAccessor();
ResultSet rs = st.getResultSet();
int rowCount = getRowCount(rs);
// Compare the row count to the length of the array
if (rowCount != expectedResults.length) {
System.out.println("Row count in ResultSet: " + rowCount + " does not match length of the expected results: " + expectedResults.length);
System.exit(1);
}
Integer j = 0;
if (rs.next()) {
String expected = expectedResults[j];
String result = "";
if (fieldAccessor instanceof String) {
result = rs.getString((String)fieldAccessor);
} else if (fieldAccessor instanceof Integer) {
result = rs.getString((Integer)fieldAccessor);
} else {
System.out.println("Unsupported field accessor value: " + fieldAccessor);
System.exit(1);
}
if (!expected.equals(result) && !(query.contains("dolt_commit")) && !(query.contains("dolt_merge"))) {
System.out.println("Query: \n" + query);
System.out.println("Expected:\n'" + expected + "'");
System.out.println("Result:\n'" + result + "'");
System.exit(1);
}
j++;
}
} else {
Integer expectedUpdateCount = t.getExpectedUpdateCount();
Integer result = st.getUpdateCount();
if ( !expectedUpdateCount.equals(result) ) {
System.out.println("Query: \n" + query);
System.out.println("Expected:\n" + expectedUpdateCount);
System.out.println("Rows Updated:\n" + result);
System.exit(1);
}
}
}
System.exit(0);
} catch (SQLException ex) {
System.out.println("An error occurred.");
ex.printStackTrace();
System.exit(1);
}
}
public static int getRowCount(ResultSet rs) throws SQLException {
int rowCount = 0;
if (rs != null) {
rs.last(); // Move to the last row
rowCount = rs.getRow(); // Get the row number (which is the row count)
rs.beforeFirst(); // Move back to the beginning of the ResultSet
}
return rowCount;
}
}