9
9
*/
10
10
package net .sf .jsqlparser .util ;
11
11
12
+ import net .sf .jsqlparser .JSQLParserException ;
12
13
import net .sf .jsqlparser .expression .AllValue ;
13
14
import net .sf .jsqlparser .expression .AnalyticExpression ;
14
15
import net .sf .jsqlparser .expression .AnyComparisonExpression ;
97
98
import net .sf .jsqlparser .expression .operators .relational .NotEqualsTo ;
98
99
import net .sf .jsqlparser .expression .operators .relational .RegExpMatchOperator ;
99
100
import net .sf .jsqlparser .expression .operators .relational .SimilarToExpression ;
101
+ import net .sf .jsqlparser .parser .CCJSqlParserUtil ;
100
102
import net .sf .jsqlparser .schema .Column ;
101
103
import net .sf .jsqlparser .schema .Table ;
102
104
import net .sf .jsqlparser .statement .Block ;
162
164
import net .sf .jsqlparser .statement .upsert .Upsert ;
163
165
164
166
import java .util .ArrayList ;
167
+ import java .util .HashSet ;
165
168
import java .util .List ;
166
169
import java .util .Map ;
170
+ import java .util .Set ;
167
171
168
172
/**
169
173
* Find all used tables within an select statement.
@@ -176,17 +180,27 @@ public class TablesNamesFinder implements SelectVisitor, FromItemVisitor, Expres
176
180
SelectItemVisitor , StatementVisitor {
177
181
178
182
private static final String NOT_SUPPORTED_YET = "Not supported yet." ;
179
- private List <String > tables ;
183
+ private Set <String > tables ;
180
184
private boolean allowColumnProcessing = false ;
181
185
182
186
private List <String > otherItemNames ;
183
187
188
+ @ Deprecated
184
189
public List <String > getTableList (Statement statement ) {
190
+ return new ArrayList <String >(getTables (statement ));
191
+ }
192
+
193
+ public Set <String > getTables (Statement statement ) {
185
194
init (false );
186
195
statement .accept (this );
187
196
return tables ;
188
197
}
189
198
199
+ public static Set <String > findTables (String sqlStr ) throws JSQLParserException {
200
+ TablesNamesFinder tablesNamesFinder = new TablesNamesFinder ();
201
+ return tablesNamesFinder .getTables (CCJSqlParserUtil .parse (sqlStr ));
202
+ }
203
+
190
204
@ Override
191
205
public void visit (Select select ) {
192
206
List <WithItem > withItemsList = select .getWithItemsList ();
@@ -222,12 +236,22 @@ public void visit(RangeExpression rangeExpression) {
222
236
/**
223
237
* Main entry for this Tool class. A list of found tables is returned.
224
238
*/
239
+ @ Deprecated
225
240
public List <String > getTableList (Expression expr ) {
241
+ return new ArrayList <String >(getTables (expr ));
242
+ }
243
+
244
+ public Set <String > getTables (Expression expr ) {
226
245
init (true );
227
246
expr .accept (this );
228
247
return tables ;
229
248
}
230
249
250
+ public static Set <String > findTablesInExpression (String exprStr ) throws JSQLParserException {
251
+ TablesNamesFinder tablesNamesFinder = new TablesNamesFinder ();
252
+ return tablesNamesFinder .getTables (CCJSqlParserUtil .parseExpression (exprStr ));
253
+ }
254
+
231
255
@ Override
232
256
public void visit (WithItem withItem ) {
233
257
otherItemNames .add (withItem .getAlias ().getName ().toLowerCase ());
@@ -254,7 +278,7 @@ public void visit(PlainSelect plainSelect) {
254
278
}
255
279
}
256
280
if (plainSelect .getSelectItems () != null ) {
257
- for (SelectItem item : plainSelect .getSelectItems ()) {
281
+ for (SelectItem <?> item : plainSelect .getSelectItems ()) {
258
282
item .accept (this );
259
283
}
260
284
}
@@ -266,6 +290,10 @@ public void visit(PlainSelect plainSelect) {
266
290
if (plainSelect .getJoins () != null ) {
267
291
for (Join join : plainSelect .getJoins ()) {
268
292
join .getFromItem ().accept (this );
293
+ join .getRightItem ().accept (this );
294
+ for (Expression expression : join .getOnExpressions ()) {
295
+ expression .accept (this );
296
+ }
269
297
}
270
298
}
271
299
if (plainSelect .getWhere () != null ) {
@@ -493,7 +521,7 @@ public void visitBinaryExpression(BinaryExpression binaryExpression) {
493
521
494
522
@ Override
495
523
public void visit (ExpressionList <?> expressionList ) {
496
- for (Expression expression : expressionList . getExpressions () ) {
524
+ for (Expression expression : expressionList ) {
497
525
expression .accept (this );
498
526
}
499
527
}
@@ -628,7 +656,7 @@ public void visit(LateralSubSelect lateralSubSelect) {
628
656
*/
629
657
protected void init (boolean allowColumnProcessing ) {
630
658
otherItemNames = new ArrayList <String >();
631
- tables = new ArrayList < String >();
659
+ tables = new HashSet < >();
632
660
this .allowColumnProcessing = allowColumnProcessing ;
633
661
}
634
662
@@ -727,6 +755,10 @@ public void visit(Delete delete) {
727
755
if (delete .getJoins () != null ) {
728
756
for (Join join : delete .getJoins ()) {
729
757
join .getFromItem ().accept (this );
758
+ join .getRightItem ().accept (this );
759
+ for (Expression expression : join .getOnExpressions ()) {
760
+ expression .accept (this );
761
+ }
730
762
}
731
763
}
732
764
@@ -738,9 +770,15 @@ public void visit(Delete delete) {
738
770
@ Override
739
771
public void visit (Update update ) {
740
772
visit (update .getTable ());
773
+ if (update .getWithItemsList () != null ) {
774
+ for (WithItem withItem : update .getWithItemsList ()) {
775
+ withItem .accept ((SelectVisitor ) this );
776
+ }
777
+ }
778
+
741
779
if (update .getStartJoins () != null ) {
742
780
for (Join join : update .getStartJoins ()) {
743
- join .getFromItem ().accept (this );
781
+ join .getRightItem ().accept (this );
744
782
}
745
783
}
746
784
if (update .getExpressions () != null ) {
@@ -755,7 +793,10 @@ public void visit(Update update) {
755
793
756
794
if (update .getJoins () != null ) {
757
795
for (Join join : update .getJoins ()) {
758
- join .getFromItem ().accept (this );
796
+ join .getRightItem ().accept (this );
797
+ for (Expression expression : join .getOnExpressions ()) {
798
+ expression .accept (this );
799
+ }
759
800
}
760
801
}
761
802
@@ -767,6 +808,11 @@ public void visit(Update update) {
767
808
@ Override
768
809
public void visit (Insert insert ) {
769
810
visit (insert .getTable ());
811
+ if (insert .getWithItemsList () != null ) {
812
+ for (WithItem withItem : insert .getWithItemsList ()) {
813
+ withItem .accept ((SelectVisitor ) this );
814
+ }
815
+ }
770
816
if (insert .getSelect () != null ) {
771
817
visit (insert .getSelect ());
772
818
}
@@ -865,7 +911,15 @@ public void visit(HexValue hexValue) {
865
911
@ Override
866
912
public void visit (Merge merge ) {
867
913
visit (merge .getTable ());
868
- merge .getFromItem ().accept ((FromItemVisitor ) this );
914
+ if (merge .getWithItemsList () != null ) {
915
+ for (WithItem withItem : merge .getWithItemsList ()) {
916
+ withItem .accept ((SelectVisitor ) this );
917
+ }
918
+ }
919
+
920
+ if (merge .getFromItem () != null ) {
921
+ merge .getFromItem ().accept (this );
922
+ }
869
923
}
870
924
871
925
@ Override
@@ -874,8 +928,8 @@ public void visit(OracleHint hint) {
874
928
}
875
929
876
930
@ Override
877
- public void visit (TableFunction valuesList ) {
878
-
931
+ public void visit (TableFunction tableFunction ) {
932
+ visit ( tableFunction . getFunction ());
879
933
}
880
934
881
935
@ Override
0 commit comments