From 11cebcfd122094402548cc8d5b53a063134284f5 Mon Sep 17 00:00:00 2001 From: Andreas Reichel Date: Thu, 11 Jul 2024 10:01:35 +0700 Subject: [PATCH] fix: TablesNamesFinder `UpdateSets` - fixes #2028 Signed-off-by: Andreas Reichel --- .../sf/jsqlparser/util/TablesNamesFinder.java | 14 +++-- .../util/TablesNamesFinderTest.java | 52 +++++++++++++++++++ 2 files changed, 61 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java index c44470534..8635ecfc2 100644 --- a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java +++ b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java @@ -172,6 +172,7 @@ import net.sf.jsqlparser.statement.show.ShowTablesStatement; import net.sf.jsqlparser.statement.truncate.Truncate; import net.sf.jsqlparser.statement.update.Update; +import net.sf.jsqlparser.statement.update.UpdateSet; import net.sf.jsqlparser.statement.upsert.Upsert; import java.util.ArrayList; @@ -389,7 +390,7 @@ public Void visit(Table tableName, S context) { @Override public void visit(Table tableName) { - FromItemVisitor.super.visit(tableName); + this.visit(tableName, null); } @Override @@ -984,21 +985,24 @@ public void visit(Delete delete) { @Override public Void visit(Update update, S context) { - visit(update.getTable(), context); if (update.getWithItemsList() != null) { for (WithItem withItem : update.getWithItemsList()) { withItem.accept((SelectVisitor) this, context); } } + visit(update.getTable(), context); + if (update.getStartJoins() != null) { for (Join join : update.getStartJoins()) { join.getRightItem().accept(this, context); } } - if (update.getExpressions() != null) { - for (Expression expression : update.getExpressions()) { - expression.accept(this, context); + + if (update.getUpdateSets() != null) { + for (UpdateSet updateSet : update.getUpdateSets()) { + updateSet.getColumns().accept(this, context); + updateSet.getValues().accept(this, context); } } diff --git a/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java b/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java index 7b91f0a96..f3025e02e 100644 --- a/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java +++ b/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java @@ -21,6 +21,8 @@ import net.sf.jsqlparser.test.TestUtils; import org.junit.jupiter.api.Test; +import java.util.Arrays; +import java.util.List; import java.util.Set; import static org.assertj.core.api.Assertions.assertThat; @@ -509,5 +511,55 @@ void testSubqueryAliasesIssue2035() throws JSQLParserException { tables = TablesNamesFinder.findTables(sqlStr); assertThat(tables).containsExactlyInAnyOrder("B", "C"); } + + @Test + void testTableRenamingIssue2028() throws JSQLParserException { + List IGNORE_SCHEMAS = + Arrays.asList("mysql", "information_schema", "performance_schema"); + final String prefix = "test_"; + + //@formatter:off + String sql = + "UPDATE table_1 a\n" + + "SET a.a1 = ( SELECT b1\n" + + " FROM table_2 b\n" + + " WHERE b.xx = 'xx' )\n" + + " , a.a2 = ( SELECT b2\n" + + " FROM table_2 b\n" + + " WHERE b.yy = 'yy' )\n" + + ";"; + String expected = + "UPDATE test_table_1 a\n" + + "SET a.a1 = ( SELECT b1\n" + + " FROM test_table_2 b\n" + + " WHERE b.xx = 'xx' )\n" + + " , a.a2 = ( SELECT b2\n" + + " FROM test_table_2 b\n" + + " WHERE b.yy = 'yy' )\n" + + ";"; + //@formatter:on + + TablesNamesFinder finder = new TablesNamesFinder() { + @Override + public Void visit(Table tableName, S context) { + String schemaName = tableName.getSchemaName(); + if (schemaName != null && IGNORE_SCHEMAS.contains(schemaName.toLowerCase())) { + return super.visit(tableName, context); + } + String originTableName = tableName.getName(); + tableName.setName(prefix + originTableName); + if (originTableName.startsWith("`")) { + tableName.setName("`" + prefix + originTableName.replace("`", "") + "`"); + } + return super.visit(tableName, context); + } + }; + finder.init(false); + + Statement statement = CCJSqlParserUtil.parse(sql); + statement.accept(finder); + + TestUtils.assertStatementCanBeDeparsedAs(statement, expected, true); + } }