GeezerVison is showing github.com — More tests for QPG (#674) · sqlancer/sqlancer@2a5ca98
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: .github/workflows/main.yml +47-1Lines changed: 47 additions & 1 deletion | Original file line number | Diff line number | Diff line change |
|---|
@@ -116,7 +116,30 @@ jobs: | 116 | 116 | run: cd cockroach-v22.2.0-beta.4.linux-amd64/ && ./cockroach sql --insecure -e "CREATE USER sqlancer; GRANT admin to sqlancer" && cd .. | 117 | 117 | - name: Run Tests | 118 | 118 | run: COCKROACHDB_AVAILABLE=true mvn -Dtest=TestCockroachDB test | 119 | | - | | 119 | + | | 120 | + cockroachdb-qpg: | | 121 | + name: QPG Tests (CockroachDB) | | 122 | + runs-on: ubuntu-latest | | 123 | + steps: | | 124 | + - uses: actions/checkout@v2 | | 125 | + with: | | 126 | + fetch-depth: 0 | | 127 | + - name: Set up JDK 11 | | 128 | + uses: actions/setup-java@v1 | | 129 | + with: | | 130 | + java-version: 11 | | 131 | + - name: Build SQLancer | | 132 | + run: mvn -B package -DskipTests=true | | 133 | + - name: Set up CockroachDB | | 134 | + run: | | | 135 | + wget -qO- https://binaries.cockroachdb.com/cockroach-v22.2.0-beta.4.linux-amd64.tgz | tar xvz | | 136 | + cd cockroach-v22.2.0-beta.4.linux-amd64/ && ./cockroach start-single-node --insecure & | | 137 | + sleep 10 | | 138 | + - name: Create SQLancer user | | 139 | + run: cd cockroach-v22.2.0-beta.4.linux-amd64/ && ./cockroach sql --insecure -e "CREATE USER sqlancer; GRANT admin to sqlancer" && cd .. | | 140 | + - name: Run Tests | | 141 | + run: COCKROACHDB_AVAILABLE=true mvn -Dtest=TestCockroachDBQPG test | | 142 | + | 120 | 143 | databend: | 121 | 144 | name: DBMS Tests (Databend) | 122 | 145 | runs-on: ubuntu-latest | @@ -313,6 +336,29 @@ jobs: | 313 | 336 | - name: Run Tests | 314 | 337 | run: TIDB_AVAILABLE=true mvn -Dtest=TestTiDB test | 315 | 338 |
| | 339 | + tidb-qpg: | | 340 | + name: QPG Tests (TiDB) | | 341 | + runs-on: ubuntu-latest | | 342 | + steps: | | 343 | + - uses: actions/checkout@v2 | | 344 | + with: | | 345 | + fetch-depth: 0 | | 346 | + - name: Set up JDK 11 | | 347 | + uses: actions/setup-java@v1 | | 348 | + with: | | 349 | + java-version: 11 | | 350 | + - name: Build SQLancer | | 351 | + run: mvn -B package -DskipTests=true | | 352 | + - name: Set up TiDB | | 353 | + run: | | | 354 | + docker pull pingcap/tidb:latest | | 355 | + docker run --name tidb-server -d -p 4000:4000 pingcap/tidb:latest | | 356 | + sleep 10 | | 357 | + - name: Create SQLancer user | | 358 | + run: sudo mysql -h 127.0.0.1 -P 4000 -u root -D test -e "CREATE USER 'sqlancer'@'%' IDENTIFIED WITH mysql_native_password BY 'sqlancer'; GRANT ALL PRIVILEGES ON *.* TO 'sqlancer'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;" | | 359 | + - name: Run Tests | | 360 | + run: TIDB_AVAILABLE=true mvn -Dtest=TestTiDBQPG test | | 361 | + | 316 | 362 | yugabyte: | 317 | 363 | name: DBMS Tests (YugabyteDB) | 318 | 364 | runs-on: ubuntu-latest | |
Collapse file Copy file name to clipboardExpand all lines: test/sqlancer/dbms/TestSQLiteQPG.java -20Lines changed: 0 additions & 20 deletions Collapse file Copy file name to clipboard +24Lines changed: 24 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| | 1 | +package sqlancer.qpg.cockroachdb; | | 2 | + | | 3 | +import static org.junit.jupiter.api.Assertions.assertEquals; | | 4 | +import static org.junit.jupiter.api.Assumptions.assumeTrue; | | 5 | + | | 6 | +import org.junit.jupiter.api.Test; | | 7 | + | | 8 | +import sqlancer.Main; | | 9 | +import sqlancer.dbms.TestConfig; | | 10 | + | | 11 | +public class TestCockroachDBQPG { | | 12 | + | | 13 | + @Test | | 14 | + public void testCockroachDBQPG() { | | 15 | + String cockroachDB = System.getenv("COCKROACHDB_AVAILABLE"); | | 16 | + boolean cockroachDBIsAvailable = cockroachDB != null && cockroachDB.equalsIgnoreCase("true"); | | 17 | + assumeTrue(cockroachDBIsAvailable); | | 18 | + assertEquals(0, | | 19 | + Main.executeMain(new String[] { "--random-seed", "0", "--timeout-seconds", TestConfig.SECONDS, | | 20 | + "--num-threads", "1", "--qpg-enable", "true", "--num-queries", TestConfig.NUM_QUERIES, | | 21 | + "cockroachdb", "--oracle", "QUERY_PARTITIONING" })); | | 22 | + } | | 23 | + | | 24 | +} |
Collapse file Copy file name to clipboard +47Lines changed: 47 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| | 1 | +package sqlancer.qpg.cockroachdb; | | 2 | + | | 3 | +import static org.junit.jupiter.api.Assertions.assertEquals; | | 4 | +import static org.junit.jupiter.api.Assumptions.assumeTrue; | | 5 | + | | 6 | +import org.junit.jupiter.api.Test; | | 7 | + | | 8 | +import sqlancer.Main; | | 9 | +import sqlancer.MainOptions; | | 10 | +import sqlancer.SQLConnection; | | 11 | +import sqlancer.common.query.SQLQueryAdapter; | | 12 | +import sqlancer.cockroachdb.CockroachDBOptions; | | 13 | +import sqlancer.cockroachdb.CockroachDBProvider; | | 14 | +import sqlancer.cockroachdb.CockroachDBProvider.CockroachDBGlobalState; | | 15 | + | | 16 | +public class TestCockroachDBQueryPlan { | | 17 | + | | 18 | + @Test | | 19 | + void testCockroachDBQueryPlan() throws Exception { | | 20 | + String cockroachDB = System.getenv("COCKROACHDB_AVAILABLE"); | | 21 | + boolean cockroachDBIsAvailable = cockroachDB != null && cockroachDB.equalsIgnoreCase("true"); | | 22 | + assumeTrue(cockroachDBIsAvailable); | | 23 | + | | 24 | + String databaseName = "cockroachdb"; | | 25 | + CockroachDBProvider provider = new CockroachDBProvider(); | | 26 | + CockroachDBGlobalState state = provider.getGlobalStateClass().getDeclaredConstructor().newInstance(); | | 27 | + CockroachDBOptions cockroachdbOption = provider.getOptionClass().getDeclaredConstructor().newInstance(); | | 28 | + state.setDbmsSpecificOptions(cockroachdbOption); | | 29 | + state.setDatabaseName(databaseName); | | 30 | + MainOptions options = new MainOptions(); | | 31 | + state.setMainOptions(options); | | 32 | + state.setState(provider.getStateToReproduce(databaseName)); | | 33 | + SQLConnection con = provider.createDatabase(state); | | 34 | + state.setConnection(con); | | 35 | + Main.StateLogger logger = new Main.StateLogger(databaseName, provider, options); | | 36 | + state.setStateLogger(logger); | | 37 | + | | 38 | + SQLQueryAdapter q = new SQLQueryAdapter("CREATE TABLE t1(a INT, b INT);", true); | | 39 | + q.execute(state); | | 40 | + q = new SQLQueryAdapter("CREATE TABLE t2(c INT);", true); | | 41 | + q.execute(state); | | 42 | + String queryPlan = provider.getQueryPlan("SELECT * FROM t1 RIGHT JOIN t2 ON a<>0;", state); | | 43 | + | | 44 | + assertEquals("left-join (cross);scan t2;select;scan t1;filters;filters (true);", queryPlan); | | 45 | + } | | 46 | + | | 47 | +} |
Collapse file Copy file name to clipboard +23Lines changed: 23 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| | 1 | +package sqlancer.qpg.sqlite; | | 2 | + | | 3 | +import static org.junit.jupiter.api.Assertions.assertEquals; | | 4 | + | | 5 | +import org.junit.jupiter.api.Test; | | 6 | + | | 7 | +import sqlancer.Main; | | 8 | +import sqlancer.dbms.TestConfig; | | 9 | + | | 10 | +public class TestSQLiteQPG { | | 11 | + | | 12 | + @Test | | 13 | + public void testSqliteQPG() { | | 14 | + assertEquals(0, | | 15 | + Main.executeMain(new String[] { "--random-seed", "0", "--timeout-seconds", TestConfig.SECONDS, | | 16 | + "--num-threads", "1", "--num-queries", TestConfig.NUM_QUERIES, "--random-string-generation", | | 17 | + "ALPHANUMERIC_SPECIALCHAR", "--database-prefix", | | 18 | + "pqsdb" /* Workaround for connections not being closed */, "--qpg-enable", "true", "sqlite3", | | 19 | + "--oracle", "NoREC", "--test-fts", "false", "--test-rtree", "false", "--test-check-constraints", | | 20 | + "false", "--test-in-operator", "false" })); | | 21 | + } | | 22 | + | | 23 | +} |
Collapse file Copy file name to clipboard +41Lines changed: 41 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| | 1 | +package sqlancer.qpg.sqlite; | | 2 | + | | 3 | +import static org.junit.jupiter.api.Assertions.assertEquals; | | 4 | + | | 5 | +import org.junit.jupiter.api.Test; | | 6 | + | | 7 | +import sqlancer.Main; | | 8 | +import sqlancer.MainOptions; | | 9 | +import sqlancer.SQLConnection; | | 10 | +import sqlancer.common.query.SQLQueryAdapter; | | 11 | +import sqlancer.sqlite3.SQLite3GlobalState; | | 12 | +import sqlancer.sqlite3.SQLite3Options; | | 13 | +import sqlancer.sqlite3.SQLite3Provider; | | 14 | + | | 15 | +public class TestSQLiteQueryPlan { | | 16 | + | | 17 | + @Test | | 18 | + void testSQLiteQueryPlan() throws Exception { | | 19 | + String databaseName = "sqlite"; | | 20 | + SQLite3Provider provider = new SQLite3Provider(); | | 21 | + SQLite3GlobalState state = provider.getGlobalStateClass().getDeclaredConstructor().newInstance(); | | 22 | + SQLite3Options sqlite3Option = provider.getOptionClass().getDeclaredConstructor().newInstance(); | | 23 | + state.setDbmsSpecificOptions(sqlite3Option); | | 24 | + state.setDatabaseName(databaseName); | | 25 | + SQLConnection con = provider.createDatabase(state); | | 26 | + state.setConnection(con); | | 27 | + MainOptions options = new MainOptions(); | | 28 | + state.setMainOptions(options); | | 29 | + Main.StateLogger logger = new Main.StateLogger(databaseName, provider, options); | | 30 | + state.setStateLogger(logger); | | 31 | + | | 32 | + SQLQueryAdapter q = new SQLQueryAdapter("CREATE TABLE t1(a INT, b INT);", true); | | 33 | + q.execute(state); | | 34 | + q = new SQLQueryAdapter("CREATE TABLE t2(c INT);", true); | | 35 | + q.execute(state); | | 36 | + String queryPlan = provider.getQueryPlan("SELECT * FROM t1 RIGHT JOIN t2 ON a<>0;", state); | | 37 | + | | 38 | + assertEquals("SCAN t1;SCAN t2;RIGHT-JOIN t2;SCAN t2;", queryPlan); | | 39 | + } | | 40 | + | | 41 | +} |
Collapse file Copy file name to clipboard +24Lines changed: 24 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| | 1 | +package sqlancer.qpg.tidb; | | 2 | + | | 3 | +import static org.junit.jupiter.api.Assertions.assertEquals; | | 4 | +import static org.junit.jupiter.api.Assumptions.assumeTrue; | | 5 | + | | 6 | +import org.junit.jupiter.api.Test; | | 7 | + | | 8 | +import sqlancer.Main; | | 9 | +import sqlancer.dbms.TestConfig; | | 10 | + | | 11 | +public class TestTiDBQPG { | | 12 | + | | 13 | + @Test | | 14 | + public void testTiDBQPG() { | | 15 | + String tiDB = System.getenv("TIDB_AVAILABLE"); | | 16 | + boolean tiDBIsAvailable = tiDB != null && tiDB.equalsIgnoreCase("true"); | | 17 | + assumeTrue(tiDBIsAvailable); | | 18 | + assertEquals(0, | | 19 | + Main.executeMain(new String[] { "--random-seed", "0", "--timeout-seconds", TestConfig.SECONDS, | | 20 | + "--num-threads", "1", "--qpg-enable", "true", "--num-queries", TestConfig.NUM_QUERIES, "tidb", | | 21 | + "--oracle", "QUERY_PARTITIONING" })); | | 22 | + } | | 23 | + | | 24 | +} |
Collapse file Copy file name to clipboard +49Lines changed: 49 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| | 1 | +package sqlancer.qpg.tidb; | | 2 | + | | 3 | +import static org.junit.jupiter.api.Assertions.assertEquals; | | 4 | +import static org.junit.jupiter.api.Assumptions.assumeTrue; | | 5 | + | | 6 | +import org.junit.jupiter.api.Test; | | 7 | + | | 8 | +import sqlancer.Main; | | 9 | +import sqlancer.MainOptions; | | 10 | +import sqlancer.SQLConnection; | | 11 | +import sqlancer.common.query.SQLQueryAdapter; | | 12 | +import sqlancer.tidb.TiDBOptions; | | 13 | +import sqlancer.tidb.TiDBProvider; | | 14 | +import sqlancer.tidb.TiDBProvider.TiDBGlobalState; | | 15 | + | | 16 | +public class TestTiDBQueryPlan { | | 17 | + | | 18 | + @Test | | 19 | + void testTiDBQueryPlan() throws Exception { | | 20 | + String tiDB = System.getenv("TIDB_AVAILABLE"); | | 21 | + boolean tiDBIsAvailable = tiDB != null && tiDB.equalsIgnoreCase("true"); | | 22 | + assumeTrue(tiDBIsAvailable); | | 23 | + | | 24 | + String databaseName = "tidb"; | | 25 | + TiDBProvider provider = new TiDBProvider(); | | 26 | + TiDBGlobalState state = provider.getGlobalStateClass().getDeclaredConstructor().newInstance(); | | 27 | + TiDBOptions TiDBOption = provider.getOptionClass().getDeclaredConstructor().newInstance(); | | 28 | + state.setDbmsSpecificOptions(TiDBOption); | | 29 | + state.setDatabaseName(databaseName); | | 30 | + MainOptions options = new MainOptions(); | | 31 | + state.setMainOptions(options); | | 32 | + Main.StateLogger logger = new Main.StateLogger(databaseName, provider, options); | | 33 | + state.setStateLogger(logger); | | 34 | + state.setState(provider.getStateToReproduce(databaseName)); | | 35 | + SQLConnection con = provider.createDatabase(state); | | 36 | + state.setConnection(con); | | 37 | + | | 38 | + SQLQueryAdapter q = new SQLQueryAdapter("CREATE TABLE t1(a INT, b INT);", true); | | 39 | + q.execute(state); | | 40 | + q = new SQLQueryAdapter("CREATE TABLE t2(c INT);", true); | | 41 | + q.execute(state); | | 42 | + String queryPlan = provider.getQueryPlan("SELECT * FROM t1 RIGHT JOIN t2 ON a<>0;", state); | | 43 | + | | 44 | + assertEquals( | | 45 | + "HashJoin_7;TableReader_10(Build);Selection_9;TableFullScan_8;TableReader_12(Probe);TableFullScan_11;", | | 46 | + queryPlan); | | 47 | + } | | 48 | + | | 49 | +} |
|