diff --git a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java index e1cf00f3f..e78a0980b 100644 --- a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java +++ b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java @@ -520,6 +520,9 @@ private Void visitPlainSelectBody(PlainSelect plainSelect, S context) { if (plainSelect.getDistinct() != null) { visitSelectItems(plainSelect.getDistinct().getOnSelectItems(), context); } + if (plainSelect.getTop() != null) { + visitExpression(plainSelect.getTop().getExpression(), context); + } visitTables(plainSelect.getIntoTables(), context); visitSelectItems(plainSelect.getSelectItems(), context); @@ -1464,16 +1467,23 @@ public Void visit(Intersects intersects, S context) { @Override public Void visit(AllColumns allColumns, S context) { - + visitColumnsTransformers(allColumns, context); return null; } @Override public Void visit(AllTableColumns allTableColumns, S context) { - + visitColumnsTransformers(allTableColumns, context); return null; } + private void visitColumnsTransformers(AllColumns allColumns, S context) { + for (ColumnsTransformer transformer : allColumns.getTransformers()) { + visitExpression(transformer.getApplyExpression(), context); + visitSelectItems(transformer.getReplaceItems(), context); + } + } + @Override public Void visit(FunctionAllColumns functionAllColumns, S context) { functionAllColumns.getFunction().accept(this, context); @@ -2411,6 +2421,9 @@ public Void visit(SimilarToExpression expr, S context) { @Override public Void visit(DeclareStatement declareStatement, S context) { + for (DeclareStatement.TypeDefExpr typeDefExpr : declareStatement.getTypeDefExprList()) { + visitExpression(typeDefExpr.getDefaultExpr(), context); + } return null; } diff --git a/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java b/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java index 551075b48..18d6be332 100644 --- a/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java +++ b/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java @@ -1198,6 +1198,25 @@ void testUpdateOrderByLimitSubquery() throws JSQLParserException { "MY_TABLE2"); } + @ParameterizedTest + @ValueSource(strings = { + "SELECT TOP ((SELECT count(*) FROM secrets)) a FROM t", + "SELECT TOP ((SELECT count(*) FROM secrets)) PERCENT a FROM t", + "SELECT * REPLACE ((SELECT max(pw) FROM secrets) AS a) FROM t", + "SELECT * EXCLUDE (b) REPLACE ((SELECT max(pw) FROM secrets) AS a) FROM t", + "SELECT t.* REPLACE ((SELECT max(pw) FROM secrets) AS a) FROM t"}) + void testSubqueryInTopOrStarReplaceIsFound(String sqlStr) throws JSQLParserException { + assertThat(TablesNamesFinder.findTables(sqlStr)).containsExactlyInAnyOrder("t", "secrets"); + } + + @ParameterizedTest + @ValueSource(strings = { + "DECLARE @x INT = (SELECT max(pw) FROM secrets)", + "DECLARE @x INT = 1, @y VARCHAR(10) = (SELECT max(pw) FROM secrets)"}) + void testSubqueryInDeclareIsFound(String sqlStr) throws JSQLParserException { + assertThat(TablesNamesFinder.findTables(sqlStr)).containsExactly("secrets"); + } + @Test void testManyDerivedNamesDoNotScaleQuadratically() { // Every plain table reference used to be matched against the CTE aliases with