Skip to content

Commit 0cb7619

Browse files
fix: find tables in TOP, star REPLACE and DECLARE initializers (#2902)
1 parent f93c8ce commit 0cb7619

2 files changed

Lines changed: 34 additions & 2 deletions

File tree

‎src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java‎

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -524,6 +524,9 @@ private <S> Void visitPlainSelectBody(PlainSelect plainSelect, S context) {
524524
if (plainSelect.getDistinct() != null) {
525525
visitSelectItems(plainSelect.getDistinct().getOnSelectItems(), context);
526526
}
527+
if (plainSelect.getTop() != null) {
528+
visitExpression(plainSelect.getTop().getExpression(), context);
529+
}
527530
visitTables(plainSelect.getIntoTables(), context);
528531

529532
visitSelectItems(plainSelect.getSelectItems(), context);
@@ -1468,16 +1471,23 @@ public <S> Void visit(Intersects intersects, S context) {
14681471

14691472
@Override
14701473
public <S> Void visit(AllColumns allColumns, S context) {
1471-
1474+
visitColumnsTransformers(allColumns, context);
14721475
return null;
14731476
}
14741477

14751478
@Override
14761479
public <S> Void visit(AllTableColumns allTableColumns, S context) {
1477-
1480+
visitColumnsTransformers(allTableColumns, context);
14781481
return null;
14791482
}
14801483

1484+
private <S> void visitColumnsTransformers(AllColumns allColumns, S context) {
1485+
for (ColumnsTransformer transformer : allColumns.getTransformers()) {
1486+
visitExpression(transformer.getApplyExpression(), context);
1487+
visitSelectItems(transformer.getReplaceItems(), context);
1488+
}
1489+
}
1490+
14811491
@Override
14821492
public <S> Void visit(FunctionAllColumns functionAllColumns, S context) {
14831493
functionAllColumns.getFunction().accept(this, context);
@@ -2427,6 +2437,9 @@ public <S> Void visit(SimilarToExpression expr, S context) {
24272437

24282438
@Override
24292439
public <S> Void visit(DeclareStatement declareStatement, S context) {
2440+
for (DeclareStatement.TypeDefExpr typeDefExpr : declareStatement.getTypeDefExprList()) {
2441+
visitExpression(typeDefExpr.getDefaultExpr(), context);
2442+
}
24302443
return null;
24312444
}
24322445

‎src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1198,6 +1198,25 @@ void testUpdateOrderByLimitSubquery() throws JSQLParserException {
11981198
"MY_TABLE2");
11991199
}
12001200

1201+
@ParameterizedTest
1202+
@ValueSource(strings = {
1203+
"SELECT TOP ((SELECT count(*) FROM secrets)) a FROM t",
1204+
"SELECT TOP ((SELECT count(*) FROM secrets)) PERCENT a FROM t",
1205+
"SELECT * REPLACE ((SELECT max(pw) FROM secrets) AS a) FROM t",
1206+
"SELECT * EXCLUDE (b) REPLACE ((SELECT max(pw) FROM secrets) AS a) FROM t",
1207+
"SELECT t.* REPLACE ((SELECT max(pw) FROM secrets) AS a) FROM t"})
1208+
void testSubqueryInTopOrStarReplaceIsFound(String sqlStr) throws JSQLParserException {
1209+
assertThat(TablesNamesFinder.findTables(sqlStr)).containsExactlyInAnyOrder("t", "secrets");
1210+
}
1211+
1212+
@ParameterizedTest
1213+
@ValueSource(strings = {
1214+
"DECLARE @x INT = (SELECT max(pw) FROM secrets)",
1215+
"DECLARE @x INT = 1, @y VARCHAR(10) = (SELECT max(pw) FROM secrets)"})
1216+
void testSubqueryInDeclareIsFound(String sqlStr) throws JSQLParserException {
1217+
assertThat(TablesNamesFinder.findTables(sqlStr)).containsExactly("secrets");
1218+
}
1219+
12011220
@Test
12021221
void testManyDerivedNamesDoNotScaleQuadratically() {
12031222
// Every plain table reference used to be matched against the CTE aliases with

0 commit comments

Comments
 (0)