Skip to content

Commit c0bc11e

Browse files
committed
Merge branch 'flaky-detect' of https://github.com/WebFuzzing/EvoMaster into flaky-detect
2 parents 569fe7e + 892314b commit c0bc11e

File tree

3 files changed

+39
-9
lines changed

3 files changed

+39
-9
lines changed

core/src/main/kotlin/org/evomaster/core/solver/SMTLibZ3DbConstraintSolver.kt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import org.evomaster.client.java.controller.api.dto.database.schema.DatabaseType
1010
import org.evomaster.client.java.controller.api.dto.database.schema.DbInfoDto
1111
import org.evomaster.client.java.controller.api.dto.database.schema.TableDto
1212
import org.evomaster.core.EMConfig
13+
import org.evomaster.core.logging.LoggingUtil
1314
import org.evomaster.core.search.gene.BooleanGene
1415
import org.evomaster.core.search.gene.Gene
1516
import org.evomaster.core.search.gene.numeric.DoubleGene
@@ -102,11 +103,21 @@ class SMTLibZ3DbConstraintSolver() : DbConstraintSolver {
102103
private fun parseStatement(sqlQuery: String): Statement {
103104
return try {
104105
CCJSqlParserUtil.parse(sqlQuery)
105-
} catch (e: JSQLParserException) {
106-
throw RuntimeException(e)
106+
} catch (_: JSQLParserException) {
107+
val sanitizedQuery = removeNotSupportedKeywords(sqlQuery)
108+
return try {
109+
CCJSqlParserUtil.parse(sanitizedQuery)
110+
} catch (e: JSQLParserException) {
111+
LoggingUtil.getInfoLogger().error("Failed to parse SQL query '$sqlQuery' as SQL Statement")
112+
throw RuntimeException(e)
113+
}
107114
}
108115
}
109116

117+
private fun removeNotSupportedKeywords(sqlQuery: String): String {
118+
return sqlQuery.replace("local temporary", "")
119+
}
120+
110121
/**
111122
* Converts Z3's response to a list of SqlActions.
112123
*

core/src/main/kotlin/org/evomaster/core/solver/SmtLibGenerator.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import org.evomaster.client.java.controller.api.dto.database.schema.DatabaseType
1010
import org.evomaster.client.java.controller.api.dto.database.schema.DbInfoDto
1111
import org.evomaster.client.java.controller.api.dto.database.schema.ForeignKeyDto
1212
import org.evomaster.client.java.controller.api.dto.database.schema.TableDto
13+
import org.evomaster.core.logging.LoggingUtil
1314
import org.evomaster.core.utils.StringUtils
1415
import org.evomaster.dbconstraint.ConstraintDatabaseType
1516
import org.evomaster.dbconstraint.ast.SqlCondition
@@ -459,7 +460,17 @@ class SmtLibGenerator(private val schema: DbInfoDto, private val numberOfRows: I
459460
val tablesFinder = TablesNamesFinder()
460461

461462
// Add tables from the FROM clause
462-
for (tableName in tablesFinder.getTables(sqlQuery)){
463+
val tables = try {
464+
tablesFinder.getTables(sqlQuery)
465+
} catch (e: Exception) {
466+
// This is because the jsqlParser does not support visit(Execute execute) {
467+
// throw new UnsupportedOperationException(NOT_SUPPORTED_YET); }
468+
// https://github.com/JSQLParser/JSqlParser/blob/484eaa1c0f623cc67f8bf324e4367f8474eb77f1/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java#L1180
469+
LoggingUtil.getInfoLogger().error("Failed to find tables: ${e.message}")
470+
emptySet<String>()
471+
}
472+
473+
for (tableName in tables){
463474
tablesMentioned.add(tableName.lowercase())
464475
}
465476

core/src/test/kotlin/org/evomaster/core/solver/SMTLibZ3DbConstraintSolverTest.kt

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
package org.evomaster.core.solver
22

3-
import net.sf.jsqlparser.JSQLParserException
43
import org.evomaster.client.java.controller.api.dto.database.schema.DbInfoDto
54
import org.evomaster.client.java.sql.DbInfoExtractor
65
import org.evomaster.client.java.sql.SqlScriptRunner
76
import org.evomaster.core.search.gene.Gene
87
import org.evomaster.core.search.gene.numeric.IntegerGene
98
import org.evomaster.core.search.gene.sql.SqlPrimaryKeyGene
109
import org.evomaster.core.search.gene.string.StringGene
11-
import org.evomaster.solver.smtlib.*
1210
import org.junit.jupiter.api.AfterAll
1311
import org.junit.jupiter.api.Assertions.*
1412
import org.junit.jupiter.api.BeforeAll
@@ -48,17 +46,15 @@ class SMTLibZ3DbConstraintSolverTest {
4846

4947
/**
5048
* Test the generation of SMT from a simple select statement and a database schema
51-
* @throws JSQLParserException if the statement is not valid
5249
*/
5350
@Test
54-
@Throws(JSQLParserException::class)
5551
fun selectFromUsers() {
5652

5753
val newActions = solver.solve(schemaDto, "SELECT * FROM Users;", 2)
5854

5955
assertEquals(2, newActions.size)
6056

61-
val genesInsert1: List<Gene> = newActions.get(0).seeTopGenes()
57+
val genesInsert1: List<Gene> = newActions[0].seeTopGenes()
6258

6359
assertEquals(4, genesInsert1.size)
6460

@@ -87,7 +83,7 @@ class SMTLibZ3DbConstraintSolverTest {
8783
}
8884
}
8985

90-
val genesInsert2: List<Gene> = newActions.get(1).seeTopGenes()
86+
val genesInsert2: List<Gene> = newActions[1].seeTopGenes()
9187

9288
assertEquals(4, genesInsert2.size)
9389

@@ -116,4 +112,16 @@ class SMTLibZ3DbConstraintSolverTest {
116112
}
117113
}
118114
}
115+
116+
/**
117+
* Test the generation of SMT from a complicated cache local temporary table does not throw exception
118+
*/
119+
@Test
120+
fun selectLocal() {
121+
122+
val newActions = solver.solve(schemaDto, "create cached local temporary table if not exists HT_feature_constraint (id bigint not null) on commit drop transactional", 2)
123+
124+
// This will be empty as the query does not correspond to the created database, just checking that it doesn't throw an exception
125+
assertEquals(0, newActions.size)
126+
}
119127
}

0 commit comments

Comments
 (0)