Skip to content

Commit c46c53f

Browse files
fix: find tables in TOP, star REPLACE and DECLARE initializers
1 parent 12548b9 commit c46c53f

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
@@ -520,6 +520,9 @@ private <S> Void visitPlainSelectBody(PlainSelect plainSelect, S context) {
520520
if (plainSelect.getDistinct() != null) {
521521
visitSelectItems(plainSelect.getDistinct().getOnSelectItems(), context);
522522
}
523+
if (plainSelect.getTop() != null) {
524+
visitExpression(plainSelect.getTop().getExpression(), context);
525+
}
523526
visitTables(plainSelect.getIntoTables(), context);
524527

525528
visitSelectItems(plainSelect.getSelectItems(), context);
@@ -1464,16 +1467,23 @@ public <S> Void visit(Intersects intersects, S context) {
14641467

14651468
@Override
14661469
public <S> Void visit(AllColumns allColumns, S context) {
1467-
1470+
visitColumnsTransformers(allColumns, context);
14681471
return null;
14691472
}
14701473

14711474
@Override
14721475
public <S> Void visit(AllTableColumns allTableColumns, S context) {
1473-
1476+
visitColumnsTransformers(allTableColumns, context);
14741477
return null;
14751478
}
14761479

1480+
private <S> void visitColumnsTransformers(AllColumns allColumns, S context) {
1481+
for (ColumnsTransformer transformer : allColumns.getTransformers()) {
1482+
visitExpression(transformer.getApplyExpression(), context);
1483+
visitSelectItems(transformer.getReplaceItems(), context);
1484+
}
1485+
}
1486+
14771487
@Override
14781488
public <S> Void visit(FunctionAllColumns functionAllColumns, S context) {
14791489
functionAllColumns.getFunction().accept(this, context);
@@ -2411,6 +2421,9 @@ public <S> Void visit(SimilarToExpression expr, S context) {
24112421

24122422
@Override
24132423
public <S> Void visit(DeclareStatement declareStatement, S context) {
2424+
for (DeclareStatement.TypeDefExpr typeDefExpr : declareStatement.getTypeDefExprList()) {
2425+
visitExpression(typeDefExpr.getDefaultExpr(), context);
2426+
}
24142427
return null;
24152428
}
24162429

‎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)