Skip to content

Commit 38656aa

Browse files
committed
Support SQL Server table variables through shared table references
1 parent b2115ac commit 38656aa

8 files changed

Lines changed: 257 additions & 62 deletions

File tree

‎src/main/java/net/sf/jsqlparser/parser/feature/Feature.java‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -670,6 +670,9 @@ public enum Feature {
670670
* @see DeclareStatement
671671
*/
672672
declare,
673+
674+
/** SQL Server local table variables in queries and DML targets. */
675+
tableVariable,
673676
/**
674677
* @see SetStatement
675678
*/

‎src/main/java/net/sf/jsqlparser/schema/Table.java‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ public class Table extends ASTNodeAccessImpl
4444

4545
private List<String> partDelimiters = new ArrayList<>();
4646

47+
private boolean tableVariable;
48+
4749
// holds the various `time travel` syntax for BigQuery, RedShift, Snowflake or RedShift
4850
private String timeTravelStr = null;
4951

@@ -67,6 +69,20 @@ public class Table extends ASTNodeAccessImpl
6769

6870
public Table() {}
6971

72+
/** Whether this reference names a local table variable rather than a catalog table. */
73+
public boolean isTableVariable() {
74+
return tableVariable;
75+
}
76+
77+
public void setTableVariable(boolean tableVariable) {
78+
this.tableVariable = tableVariable;
79+
}
80+
81+
public Table withTableVariable(boolean tableVariable) {
82+
setTableVariable(tableVariable);
83+
return this;
84+
}
85+
7086
/**
7187
* Instantiates a new Table.
7288
*
@@ -527,6 +543,9 @@ public Table setResolvedTable(Table resolvedTable) {
527543
* @return the provided table
528544
*/
529545
public Table setUnsetCatalogAndSchema(String currentCatalogName, String currentSchemaName) {
546+
if (tableVariable) {
547+
return this;
548+
}
530549
String databaseName = getDatabaseName();
531550
if (databaseName == null || databaseName.isEmpty()) {
532551
setDatabaseName(currentCatalogName);
@@ -561,6 +580,7 @@ public static Table[] setUnsetCatalogAndSchema(String currentCatalogName,
561580
@Override
562581
public Table clone() {
563582
Table clone = new Table(this.getFullyQualifiedName());
583+
clone.setTableVariable(tableVariable);
564584
clone.setResolvedTable(this.resolvedTable != null ? this.resolvedTable.clone() : null);
565585
return clone;
566586
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,9 @@ protected String extractTableName(Table table) {
510510
@Override
511511
public <S> Void visit(Table table, S context) {
512512
String tableWholeName = extractTableName(table);
513-
if (!otherItemNames.contains(tableWholeName)) {
513+
if (table.isTableVariable()) {
514+
otherItemNames.add(tableWholeName);
515+
} else if (!otherItemNames.contains(tableWholeName)) {
514516
tables.add(tableWholeName);
515517
}
516518
if (table.getPivot() != null) {

‎src/main/java/net/sf/jsqlparser/util/validation/feature/FeaturesAllowed.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ public class FeaturesAllowed implements FeatureSetValidation, ModifyableFeatureS
8484
Feature.orderBy,
8585
Feature.orderByNullOrdering,
8686
Feature.tableStatement,
87+
Feature.tableVariable,
8788

8889
Feature.function).unmodifyable();
8990
/**

‎src/main/java/net/sf/jsqlparser/util/validation/feature/SqlServerVersion.java‎

Lines changed: 27 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -22,26 +22,20 @@
2222
*/
2323
public enum SqlServerVersion implements Version {
2424
V2019("2019",
25-
EnumSet.of(
26-
// supported if used with jdbc
25+
EnumSet.of(// supported if used with jdbc
2726
Feature.jdbcParameter,
28-
Feature.jdbcNamedParameter,
29-
// expressions
30-
Feature.exprLike,
31-
// https://docs.microsoft.com/en-us/sql/t-sql/queries/select-transact-sql?view=sql-server-ver15
27+
Feature.jdbcNamedParameter, // expressions
28+
Feature.exprLike, // https://docs.microsoft.com/en-us/sql/t-sql/queries/select-transact-sql?view=sql-server-ver15
3229
Feature.select,
3330
Feature.selectInto,
3431
Feature.withItem,
35-
Feature.selectGroupBy, Feature.function,
36-
// https://docs.microsoft.com/en-us/sql/t-sql/queries/from-transact-sql?view=sql-server-ver15
32+
Feature.selectGroupBy, Feature.function, // https://docs.microsoft.com/en-us/sql/t-sql/queries/from-transact-sql?view=sql-server-ver15
3733
// see user_defined_function
3834
Feature.tableFunction,
3935
Feature.selectHaving, Feature.orderBy,
4036
Feature.distinct,
41-
Feature.withItem, Feature.withItemRecursive,
42-
// https://docs.microsoft.com/en-us/sql/t-sql/queries/top-transact-sql?view=sql-server-ver15
43-
Feature.top,
44-
// https://docs.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-ver15
37+
Feature.withItem, Feature.withItemRecursive, // https://docs.microsoft.com/en-us/sql/t-sql/queries/top-transact-sql?view=sql-server-ver15
38+
Feature.top, // https://docs.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-ver15
4539
Feature.offset, Feature.offsetParam, Feature.fetch, Feature.fetchFirst,
4640
Feature.fetchNext,
4741

@@ -67,26 +61,19 @@ public enum SqlServerVersion implements Version {
6761
// https://docs.microsoft.com/en-us/sql/t-sql/statements/insert-transact-sql?view=sql-server-ver15
6862
Feature.insert,
6963
Feature.insertValues,
70-
Feature.insertFromSelect,
71-
// https://docs.microsoft.com/en-us/sql/t-sql/queries/update-transact-sql?view=sql-server-ver15
64+
Feature.insertFromSelect, // https://docs.microsoft.com/en-us/sql/t-sql/queries/update-transact-sql?view=sql-server-ver15
7265
Feature.update,
7366
Feature.updateFrom,
7467

7568
// https://docs.microsoft.com/en-us/sql/t-sql/statements/delete-transact-sql?view=sql-server-ver15
76-
Feature.delete,
77-
// https://docs.microsoft.com/en-us/sql/t-sql/statements/truncate-table-transact-sql?view=sql-server-ver15
69+
Feature.delete, // https://docs.microsoft.com/en-us/sql/t-sql/statements/truncate-table-transact-sql?view=sql-server-ver15
7870
Feature.truncate,
7971

80-
Feature.drop,
81-
// https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-table-transact-sql?view=sql-server-ver15
82-
Feature.dropTable,
83-
// https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-index-transact-sql?view=sql-server-ver15
84-
Feature.dropIndex,
85-
// https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-view-transact-sql?view=sql-server-ver15
86-
Feature.dropView,
87-
// https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-schema-transact-sql?view=sql-server-ver15
88-
Feature.dropSchema,
89-
// https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-sequence-transact-sql?view=sql-server-ver15
72+
Feature.drop, // https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-table-transact-sql?view=sql-server-ver15
73+
Feature.dropTable, // https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-index-transact-sql?view=sql-server-ver15
74+
Feature.dropIndex, // https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-view-transact-sql?view=sql-server-ver15
75+
Feature.dropView, // https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-schema-transact-sql?view=sql-server-ver15
76+
Feature.dropSchema, // https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-sequence-transact-sql?view=sql-server-ver15
9077
Feature.dropSequence,
9178
Feature.dropTableIfExists, Feature.dropIndexIfExists, Feature.dropViewIfExists,
9279
Feature.dropSchemaIfExists, Feature.dropSequenceIfExists,
@@ -99,38 +86,25 @@ public enum SqlServerVersion implements Version {
9986
Feature.set,
10087

10188
// https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-table-transact-sql?view=sql-server-ver15
102-
Feature.alterTable,
103-
// https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-sequence-transact-sql?view=sql-server-ver15
104-
Feature.alterSequence,
105-
// https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-view-transact-sql?view=sql-server-ver15
106-
Feature.alterView,
107-
// https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-index-transact-sql?view=sql-server-ver15
108-
Feature.alterIndex,
109-
// https://docs.microsoft.com/en-us/sql/t-sql/statements/create-index-transact-sql?view=sql-server-ver15
110-
Feature.createIndex,
111-
// https://docs.microsoft.com/en-us/sql/t-sql/statements/create-sequence-transact-sql?view=sql-server-ver15
112-
Feature.createSequence,
113-
// https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql?view=sql-server-ver15
89+
Feature.alterTable, // https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-sequence-transact-sql?view=sql-server-ver15
90+
Feature.alterSequence, // https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-view-transact-sql?view=sql-server-ver15
91+
Feature.alterView, // https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-index-transact-sql?view=sql-server-ver15
92+
Feature.alterIndex, // https://docs.microsoft.com/en-us/sql/t-sql/statements/create-index-transact-sql?view=sql-server-ver15
93+
Feature.createIndex, // https://docs.microsoft.com/en-us/sql/t-sql/statements/create-sequence-transact-sql?view=sql-server-ver15
94+
Feature.createSequence, // https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql?view=sql-server-ver15
11495
Feature.createTable, Feature.createTableTableOptionStrings,
115-
Feature.createTableFromSelect,
116-
// https://docs.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql?view=sql-server-ver15
96+
Feature.createTableFromSelect, // https://docs.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql?view=sql-server-ver15
11797
// https://docs.microsoft.com/en-us/sql/t-sql/statements/create-procedure-transact-sql?view=sql-server-ver15
11898
Feature.functionalStatement, Feature.createProcedure, Feature.createFunction,
11999
Feature.block,
120100
Feature.declare,
121-
// https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql?view=sql-server-ver15
122-
Feature.createSchema,
123-
// https://docs.microsoft.com/en-us/sql/t-sql/statements/create-view-transact-sql?view=sql-server-ver15
124-
Feature.createView,
125-
// https://docs.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-ver15
126-
Feature.createTrigger,
127-
// https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql?view=sql-server-ver15
128-
Feature.merge,
129-
// https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-transact-sql?view=sql-server-ver15
130-
Feature.grant,
131-
// https://docs.microsoft.com/en-us/sql/t-sql/language-elements/commit-transaction-transact-sql?view=sql-server-ver15
132-
Feature.commit,
133-
// special sql-server features
101+
Feature.tableVariable, // https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql?view=sql-server-ver15
102+
Feature.createSchema, // https://docs.microsoft.com/en-us/sql/t-sql/statements/create-view-transact-sql?view=sql-server-ver15
103+
Feature.createView, // https://docs.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-ver15
104+
Feature.createTrigger, // https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql?view=sql-server-ver15
105+
Feature.merge, // https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-transact-sql?view=sql-server-ver15
106+
Feature.grant, // https://docs.microsoft.com/en-us/sql/t-sql/language-elements/commit-transaction-transact-sql?view=sql-server-ver15
107+
Feature.commit, // special sql-server features
134108
// https://docs.microsoft.com/en-us/sql/relational-databases/xml/for-xml-sql-server?view=sql-server-ver15
135109
Feature.selectForXmlPath,
136110
Feature.use, Feature.allowSquareBracketQuotation, //

‎src/main/java/net/sf/jsqlparser/util/validation/validator/SelectValidator.java‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,8 +239,12 @@ public <S> Void visit(ParenthesedSelect selectBody, S context) {
239239

240240
@Override
241241
public <S> Void visit(Table table, S context) {
242-
validateNameWithAlias(NamedObject.table, table.getFullyQualifiedName(),
243-
ValidationUtil.getAlias(table.getAlias()));
242+
if (table.isTableVariable()) {
243+
validateFeature(Feature.tableVariable);
244+
} else {
245+
validateNameWithAlias(NamedObject.table, table.getFullyQualifiedName(),
246+
ValidationUtil.getAlias(table.getAlias()));
247+
}
244248

245249
validateOptional(table.getPivot(), p -> p.accept(this, context));
246250
validateOptional(table.getUnPivot(), up -> up.accept(this, context));

‎src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt‎

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4637,7 +4637,7 @@ Insert Insert():
46374637
<K_OVERWRITE> <K_TABLE> { insert.setOverwrite(true); insert.setTableKeyword(true); }
46384638
| <K_INTO> [ LOOKAHEAD(2) <K_TABLE> { insert.setTableKeyword(true); }]
46394639
)
4640-
] table=Table()
4640+
] table=TableReference()
46414641
[ LOOKAHEAD(2) <K_PARTITION> "(" partitions=Partitions() ")" ]
46424642

46434643
[ LOOKAHEAD({ isAliasAhead() }) [<K_AS> { useAs = true; } ] name=RelObjectName() { table.setAlias(new Alias(name,useAs)); }]
@@ -5264,26 +5264,50 @@ Table Table() #TableName :
52645264
}
52655265
}
52665266

5267+
/** A table source or DML target; catalog-only DDL continues to use Table(). */
5268+
Table TableReference() #void :
5269+
{
5270+
Table table;
5271+
}
5272+
{
5273+
( table=TableVariable() | table=Table() )
5274+
{ return table; }
5275+
}
5276+
5277+
Table TableVariable() #TableName :
5278+
{
5279+
Token variable;
5280+
Table table;
5281+
}
5282+
{
5283+
variable=<S_AT_IDENTIFIER>
5284+
{
5285+
requireAccessSyntax(!variable.image.startsWith("@@"),
5286+
"A table variable must be a local variable");
5287+
table = new Table(variable.image, false).withTableVariable(true);
5288+
linkAST(table, jjtThis);
5289+
return table;
5290+
}
5291+
}
5292+
52675293
Table TableWithAlias():
52685294
{
52695295
Table table = null;
52705296
Alias alias = null;
52715297
}
52725298
{
5273-
table=Table()
5299+
table=TableReference()
52745300
[ LOOKAHEAD({ isAliasAhead() }) alias=Alias() { table.setAlias(alias); }]
52755301
{ return table; }
52765302
}
52775303

52785304
Table TableWithAliasAndMysqlIndexHint():
52795305
{
52805306
Table table = null;
5281-
Alias alias = null;
52825307
MySQLIndexHint indexHint = null;
52835308
}
52845309
{
5285-
table=Table()
5286-
[ LOOKAHEAD({ isAliasAhead() }) alias=Alias() { table.setAlias(alias); } ]
5310+
table=TableWithAlias()
52875311
[ LOOKAHEAD(2) indexHint=MySQLIndexHint() { table.setHint(indexHint); } ]
52885312
{ return table; }
52895313
}
@@ -7045,7 +7069,7 @@ FromItem FromItem() #FromItem:
70457069
|| (getToken(1).kind == K_LATERAL && getToken(2).kind != OPENING_BRACKET) })
70467070
fromItem=TableFunction()
70477071
|
7048-
LOOKAHEAD(3) fromItem=Table()
7072+
LOOKAHEAD(3) fromItem=TableReference()
70497073
|
70507074
LOOKAHEAD({ isNestedSetOperationAhead() }) (
70517075
fromItem=ParenthesedSelect()

0 commit comments

Comments
 (0)