Skip to content

Commit f278315

Browse files
committed
Use a ServiceLoader to pick up database testing implementations
This change allows SQLancer to pick up database providers in other JARs than the SQLancer JAR, if they are on the classpath.
1 parent 4d9eeda commit f278315

16 files changed

Lines changed: 72 additions & 28 deletions

pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,11 @@
262262
</build>
263263

264264
<dependencies>
265+
<dependency>
266+
<groupId>com.google.auto.service</groupId>
267+
<artifactId>auto-service</artifactId>
268+
<version>1.0.1</version>
269+
</dependency>
265270
<dependency>
266271
<groupId>com.beust</groupId>
267272
<artifactId>jcommander</artifactId>

src/sqlancer/Main.java

Lines changed: 14 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.util.HashMap;
1313
import java.util.List;
1414
import java.util.Map;
15+
import java.util.ServiceLoader;
1516
import java.util.concurrent.ExecutorService;
1617
import java.util.concurrent.Executors;
1718
import java.util.concurrent.ScheduledExecutorService;
@@ -21,23 +22,9 @@
2122
import com.beust.jcommander.JCommander;
2223
import com.beust.jcommander.JCommander.Builder;
2324

24-
import sqlancer.arangodb.ArangoDBProvider;
25-
import sqlancer.citus.CitusProvider;
26-
import sqlancer.clickhouse.ClickHouseProvider;
27-
import sqlancer.cockroachdb.CockroachDBProvider;
2825
import sqlancer.common.log.Loggable;
2926
import sqlancer.common.query.Query;
3027
import sqlancer.common.query.SQLancerResultSet;
31-
import sqlancer.cosmos.CosmosProvider;
32-
import sqlancer.duckdb.DuckDBProvider;
33-
import sqlancer.h2.H2Provider;
34-
import sqlancer.mariadb.MariaDBProvider;
35-
import sqlancer.mongodb.MongoDBProvider;
36-
import sqlancer.mysql.MySQLProvider;
37-
import sqlancer.oceanbase.OceanBaseProvider;
38-
import sqlancer.postgres.PostgresProvider;
39-
import sqlancer.sqlite3.SQLite3Provider;
40-
import sqlancer.tidb.TiDBProvider;
4128

4229
public final class Main {
4330

@@ -543,22 +530,21 @@ private boolean run(MainOptions options, ExecutorService execService,
543530
return threadsShutdown == 0 ? 0 : options.getErrorExitCode();
544531
}
545532

533+
/**
534+
* To register a new provider, it is necessary to implement the DatabaseProvider interface and add an additional
535+
* configuration file, see https://docs.oracle.com/javase/9/docs/api/java/util/ServiceLoader.html. Currently, we use
536+
* an @AutoService annotation to create the configuration file automatically. This allows SQLancer to pick up
537+
* providers in other JARs on the classpath.
538+
*
539+
* @return The list of service providers on the classpath
540+
*/
546541
static List<DatabaseProvider<?, ?, ?>> getDBMSProviders() {
547542
List<DatabaseProvider<?, ?, ?>> providers = new ArrayList<>();
548-
providers.add(new SQLite3Provider());
549-
providers.add(new CockroachDBProvider());
550-
providers.add(new MySQLProvider());
551-
providers.add(new MariaDBProvider());
552-
providers.add(new TiDBProvider());
553-
providers.add(new PostgresProvider());
554-
providers.add(new CitusProvider());
555-
providers.add(new ClickHouseProvider());
556-
providers.add(new DuckDBProvider());
557-
providers.add(new H2Provider());
558-
providers.add(new MongoDBProvider());
559-
providers.add(new CosmosProvider());
560-
providers.add(new ArangoDBProvider());
561-
providers.add(new OceanBaseProvider());
543+
@SuppressWarnings("rawtypes")
544+
ServiceLoader<DatabaseProvider> loader = ServiceLoader.load(DatabaseProvider.class);
545+
for (DatabaseProvider<?, ?, ?> provider : loader) {
546+
providers.add(provider);
547+
}
562548
return providers;
563549
}
564550

src/sqlancer/arangodb/ArangoDBProvider.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55

66
import com.arangodb.ArangoDB;
77
import com.arangodb.ArangoDatabase;
8+
import com.google.auto.service.AutoService;
89

910
import sqlancer.AbstractAction;
11+
import sqlancer.DatabaseProvider;
1012
import sqlancer.ExecutionTimer;
1113
import sqlancer.GlobalState;
1214
import sqlancer.IgnoreMeException;
@@ -19,6 +21,7 @@
1921
import sqlancer.common.log.LoggableFactory;
2022
import sqlancer.common.query.Query;
2123

24+
@AutoService(DatabaseProvider.class)
2225
public class ArangoDBProvider
2326
extends ProviderAdapter<ArangoDBProvider.ArangoDBGlobalState, ArangoDBOptions, ArangoDBConnection> {
2427

src/sqlancer/citus/CitusProvider.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@
1010
import java.util.List;
1111
import java.util.stream.Collectors;
1212

13+
import com.google.auto.service.AutoService;
14+
1315
import sqlancer.AbstractAction;
16+
import sqlancer.DatabaseProvider;
1417
import sqlancer.IgnoreMeException;
1518
import sqlancer.Randomly;
1619
import sqlancer.SQLConnection;
@@ -51,6 +54,7 @@
5154
import sqlancer.postgres.gen.PostgresTruncateGenerator;
5255
import sqlancer.postgres.gen.PostgresVacuumGenerator;
5356

57+
@AutoService(DatabaseProvider.class)
5458
public class CitusProvider extends PostgresProvider {
5559

5660
@SuppressWarnings("unchecked")

src/sqlancer/clickhouse/ClickHouseProvider.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66
import java.sql.Statement;
77
import java.util.stream.Collectors;
88

9+
import com.google.auto.service.AutoService;
10+
911
import sqlancer.AbstractAction;
12+
import sqlancer.DatabaseProvider;
1013
import sqlancer.IgnoreMeException;
1114
import sqlancer.MainOptions;
1215
import sqlancer.Randomly;
@@ -21,6 +24,7 @@
2124
import sqlancer.common.query.SQLQueryAdapter;
2225
import sqlancer.common.query.SQLQueryProvider;
2326

27+
@AutoService(DatabaseProvider.class)
2428
public class ClickHouseProvider extends SQLProviderAdapter<ClickHouseGlobalState, ClickHouseOptions> {
2529

2630
public ClickHouseProvider() {

src/sqlancer/cockroachdb/CockroachDBProvider.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
import java.util.List;
99
import java.util.stream.Collectors;
1010

11+
import com.google.auto.service.AutoService;
12+
13+
import sqlancer.DatabaseProvider;
1114
import sqlancer.IgnoreMeException;
1215
import sqlancer.Main.QueryManager;
1316
import sqlancer.MainOptions;
@@ -34,6 +37,7 @@
3437
import sqlancer.common.query.SQLQueryAdapter;
3538
import sqlancer.common.query.SQLQueryProvider;
3639

40+
@AutoService(DatabaseProvider.class)
3741
public class CockroachDBProvider extends SQLProviderAdapter<CockroachDBGlobalState, CockroachDBOptions> {
3842

3943
public CockroachDBProvider() {

src/sqlancer/cosmos/CosmosProvider.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package sqlancer.cosmos;
22

3+
import com.google.auto.service.AutoService;
34
import com.mongodb.ConnectionString;
45
import com.mongodb.MongoClientSettings;
56
import com.mongodb.client.MongoClient;
67
import com.mongodb.client.MongoClients;
78
import com.mongodb.client.MongoDatabase;
89

10+
import sqlancer.DatabaseProvider;
911
import sqlancer.IgnoreMeException;
1012
import sqlancer.ProviderAdapter;
1113
import sqlancer.Randomly;
@@ -17,6 +19,7 @@
1719
import sqlancer.mongodb.MongoDBQueryAdapter;
1820
import sqlancer.mongodb.gen.MongoDBTableGenerator;
1921

22+
@AutoService(DatabaseProvider.class)
2023
public class CosmosProvider extends
2124
ProviderAdapter<sqlancer.mongodb.MongoDBProvider.MongoDBGlobalState, MongoDBOptions, MongoDBConnection> {
2225

src/sqlancer/duckdb/DuckDBProvider.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
import java.sql.DriverManager;
44
import java.sql.SQLException;
55

6+
import com.google.auto.service.AutoService;
7+
68
import sqlancer.AbstractAction;
9+
import sqlancer.DatabaseProvider;
710
import sqlancer.IgnoreMeException;
811
import sqlancer.Randomly;
912
import sqlancer.SQLConnection;
@@ -22,6 +25,7 @@
2225
import sqlancer.duckdb.gen.DuckDBUpdateGenerator;
2326
import sqlancer.duckdb.gen.DuckDBViewGenerator;
2427

28+
@AutoService(DatabaseProvider.class)
2529
public class DuckDBProvider extends SQLProviderAdapter<DuckDBGlobalState, DuckDBOptions> {
2630

2731
public DuckDBProvider() {

src/sqlancer/h2/H2Provider.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
import java.sql.DriverManager;
55
import java.sql.SQLException;
66

7+
import com.google.auto.service.AutoService;
8+
79
import sqlancer.AbstractAction;
10+
import sqlancer.DatabaseProvider;
811
import sqlancer.IgnoreMeException;
912
import sqlancer.Randomly;
1013
import sqlancer.SQLConnection;
@@ -15,6 +18,7 @@
1518
import sqlancer.common.query.SQLQueryProvider;
1619
import sqlancer.h2.H2Provider.H2GlobalState;
1720

21+
@AutoService(DatabaseProvider.class)
1822
public class H2Provider extends SQLProviderAdapter<H2GlobalState, H2Options> {
1923

2024
public H2Provider() {

src/sqlancer/mariadb/MariaDBProvider.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
import java.util.ArrayList;
88
import java.util.List;
99

10+
import com.google.auto.service.AutoService;
11+
12+
import sqlancer.DatabaseProvider;
1013
import sqlancer.IgnoreMeException;
1114
import sqlancer.MainOptions;
1215
import sqlancer.Randomly;
@@ -24,6 +27,7 @@
2427
import sqlancer.mariadb.gen.MariaDBTruncateGenerator;
2528
import sqlancer.mariadb.gen.MariaDBUpdateGenerator;
2629

30+
@AutoService(DatabaseProvider.class)
2731
public class MariaDBProvider extends SQLProviderAdapter<MariaDBGlobalState, MariaDBOptions> {
2832

2933
public static final int MAX_EXPRESSION_DEPTH = 3;

0 commit comments

Comments
 (0)