Skip to content

Commit da969af

Browse files
authored
fix: preserve qualified names in TABLE query output (#2660)
Signed-off-by: minleejae <mmj9808@gmail.com>
1 parent 834d958 commit da969af

3 files changed

Lines changed: 63 additions & 3 deletions

File tree

src/main/java/net/sf/jsqlparser/statement/select/TableStatement.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public void setTable(Table table) {
3030

3131
@Override
3232
public StringBuilder appendSelectBodyTo(StringBuilder builder) {
33-
builder.append("TABLE ").append(table.getName());
33+
builder.append("TABLE ").append(table);
3434
return builder;
3535
}
3636

src/main/java/net/sf/jsqlparser/util/deparser/TableStatementDeParser.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,7 @@ public <S> StringBuilder visit(LateralSubSelect lateralSubSelect, S context) {
8484

8585
@Override
8686
public <S> StringBuilder visit(TableStatement tableStatement, S context) {
87-
builder.append("TABLE ");
88-
builder.append(tableStatement.getTable());
87+
tableStatement.appendSelectBodyTo(builder);
8988
if (tableStatement.getOrderByElements() != null) {
9089
new OrderByDeParser(expressionVisitor, builder)
9190
.deParse(tableStatement.getOrderByElements());
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2026 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.statement.select;
11+
12+
import net.sf.jsqlparser.JSQLParserException;
13+
import net.sf.jsqlparser.parser.AbstractJSqlParser.Dialect;
14+
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
15+
import net.sf.jsqlparser.statement.Statement;
16+
import net.sf.jsqlparser.util.TablesNamesFinder;
17+
import net.sf.jsqlparser.util.deparser.StatementDeParser;
18+
import org.junit.jupiter.api.Test;
19+
import org.junit.jupiter.params.ParameterizedTest;
20+
import org.junit.jupiter.params.provider.ValueSource;
21+
22+
import java.util.Set;
23+
24+
import static org.junit.jupiter.api.Assertions.assertEquals;
25+
26+
class TableStatementTest {
27+
private TableStatement parse(String sql) throws JSQLParserException {
28+
return (TableStatement) CCJSqlParserUtil.parse(sql, p -> p.withDialect(Dialect.MYSQL));
29+
}
30+
31+
@ParameterizedTest
32+
@ValueSource(strings = {
33+
"TABLE inventory.items",
34+
"TABLE `inventory`.`items` ORDER BY id DESC LIMIT 2 OFFSET 1",
35+
"TABLE `db.with.dot`.`table.with.dot` LIMIT 1",
36+
"TABLE items ORDER BY id LIMIT 2"
37+
})
38+
void preservesTableIdentity(String sql) throws JSQLParserException {
39+
TableStatement statement = parse(sql);
40+
String name = statement.getTable().getFullyQualifiedName();
41+
StringBuilder output = new StringBuilder();
42+
statement.accept(new StatementDeParser(output), null);
43+
44+
assertEquals(sql, statement.toString());
45+
assertEquals(statement.toString(), output.toString());
46+
assertEquals(name, parse(statement.toString()).getTable().getFullyQualifiedName());
47+
assertEquals(Set.of(name), new TablesNamesFinder().getTables((Statement) statement));
48+
}
49+
50+
@Test
51+
void rendersChangedDatabase() throws JSQLParserException {
52+
TableStatement statement = parse("TABLE old_db.items ORDER BY id LIMIT 1");
53+
statement.getTable().setSchemaName("new_db");
54+
String expected = "TABLE new_db.items ORDER BY id LIMIT 1";
55+
StringBuilder output = new StringBuilder();
56+
statement.accept(new StatementDeParser(output), null);
57+
assertEquals(expected, statement.toString());
58+
assertEquals(expected, output.toString());
59+
assertEquals("new_db", parse(expected).getTable().getSchemaName());
60+
}
61+
}

0 commit comments

Comments
 (0)