diff --git a/client-java/sql/src/main/java/org/evomaster/client/java/sql/internal/SqlNameContext.java b/client-java/sql/src/main/java/org/evomaster/client/java/sql/internal/SqlNameContext.java index edabbacf62..e0d28af5c5 100644 --- a/client-java/sql/src/main/java/org/evomaster/client/java/sql/internal/SqlNameContext.java +++ b/client-java/sql/src/main/java/org/evomaster/client/java/sql/internal/SqlNameContext.java @@ -144,9 +144,8 @@ public void visit(Table table) { @Override public void visit(ParenthesedSelect selectBody) { - PlainSelect plainSelect = selectBody.getPlainSelect(); - SqlNameContext subContext = new SqlNameContext(plainSelect); - tableAliases.putAll(subContext.tableAliases); + names.add(UNNAMED_TABLE); + handleAlias(tableAliases, selectBody); } @Override @@ -240,7 +239,7 @@ public void visit(Table table) { @Override public void visit(ParenthesedSelect selectBody) { - handleAlias(aliases, selectBody.getPlainSelect()); + handleAlias(aliases, selectBody); } @Override @@ -262,8 +261,8 @@ public void visit(ParenthesedFromItem aThis) { } - private static void handleAlias(Map aliases, PlainSelect plainSelect) { - Alias alias = plainSelect.getFromItem().getAlias(); + private static void handleAlias(Map aliases, ParenthesedSelect select) { + Alias alias = select.getAlias(); if (alias != null) { String aliasName = alias.getName(); if (aliasName != null) { @@ -290,3 +289,4 @@ private static void handleAlias(Map aliases, Table table) { } } } + diff --git a/client-java/sql/src/test/java/org/evomaster/client/java/sql/internal/SqlNameContextTest.java b/client-java/sql/src/test/java/org/evomaster/client/java/sql/internal/SqlNameContextTest.java new file mode 100644 index 0000000000..1a8b4283c8 --- /dev/null +++ b/client-java/sql/src/test/java/org/evomaster/client/java/sql/internal/SqlNameContextTest.java @@ -0,0 +1,31 @@ +package org.evomaster.client.java.sql.internal; + +import net.sf.jsqlparser.schema.Column; +import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.Statement; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class SqlNameContextTest { + + @Test + public void handlesAliasOnParenthesizedUnionSubquery() { + String sql = "SELECT derived.id\n" + + "FROM (\n" + + " SELECT id FROM constraint_requires\n" + + " UNION ALL\n" + + " SELECT id FROM constraint_excludes\n" + + ") derived\n" + + "WHERE derived.id = 2"; + + Statement statement = SqlParserUtils.parseSqlCommand(sql); + SqlNameContext context = assertDoesNotThrow(() -> new SqlNameContext(statement)); + + assertEquals( + SqlNameContext.UNNAMED_TABLE, + context.getFullyQualifiedTableName(new Column(new Table("derived"), "id")) + ); + } +}