Skip to content

Commit b7fdec9

Browse files
authored
Merge pull request #1592 from WebFuzzing/bugs-in-db
Bugs in db
2 parents d3bfd40 + 6949f95 commit b7fdec9

2 files changed

Lines changed: 41 additions & 6 deletions

File tree

client-java/sql/src/main/java/org/evomaster/client/java/sql/internal/SqlNameContext.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,8 @@ public void visit(Table table) {
144144

145145
@Override
146146
public void visit(ParenthesedSelect selectBody) {
147-
PlainSelect plainSelect = selectBody.getPlainSelect();
148-
SqlNameContext subContext = new SqlNameContext(plainSelect);
149-
tableAliases.putAll(subContext.tableAliases);
147+
names.add(UNNAMED_TABLE);
148+
handleAlias(tableAliases, selectBody);
150149
}
151150

152151
@Override
@@ -240,7 +239,7 @@ public void visit(Table table) {
240239

241240
@Override
242241
public void visit(ParenthesedSelect selectBody) {
243-
handleAlias(aliases, selectBody.getPlainSelect());
242+
handleAlias(aliases, selectBody);
244243
}
245244

246245
@Override
@@ -262,8 +261,13 @@ public void visit(ParenthesedFromItem aThis) {
262261
}
263262

264263

265-
private static void handleAlias(Map<String, String> aliases, PlainSelect plainSelect) {
266-
Alias alias = plainSelect.getFromItem().getAlias();
264+
private static void handleAlias(Map<String, String> aliases, ParenthesedSelect select) {
265+
/*
266+
The alias belongs to the parenthesized FROM item itself. Do not read
267+
it from the inner select, as UNION/INTERSECT/EXCEPT subqueries are
268+
represented by JSqlParser as SetOperationList, not PlainSelect.
269+
*/
270+
Alias alias = select.getAlias();
267271
if (alias != null) {
268272
String aliasName = alias.getName();
269273
if (aliasName != null) {
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.evomaster.client.java.sql.internal;
2+
3+
import net.sf.jsqlparser.schema.Column;
4+
import net.sf.jsqlparser.schema.Table;
5+
import net.sf.jsqlparser.statement.Statement;
6+
import org.junit.jupiter.api.Test;
7+
8+
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
9+
import static org.junit.jupiter.api.Assertions.assertEquals;
10+
11+
public class SqlNameContextTest {
12+
13+
@Test
14+
public void handlesAliasOnParenthesizedUnionSubquery() {
15+
String sql = "SELECT derived.id\n" +
16+
"FROM (\n" +
17+
" SELECT id FROM constraint_requires\n" +
18+
" UNION ALL\n" +
19+
" SELECT id FROM constraint_excludes\n" +
20+
") derived\n" +
21+
"WHERE derived.id = 2";
22+
23+
Statement statement = SqlParserUtils.parseSqlCommand(sql);
24+
SqlNameContext context = assertDoesNotThrow(() -> new SqlNameContext(statement));
25+
26+
assertEquals(
27+
SqlNameContext.UNNAMED_TABLE,
28+
context.getFullyQualifiedTableName(new Column(new Table("derived"), "id"))
29+
);
30+
}
31+
}

0 commit comments

Comments
 (0)