Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/main/java/net/sf/jsqlparser/parser/feature/Feature.java
Original file line number Diff line number Diff line change
Expand Up @@ -670,6 +670,9 @@ public enum Feature {
* @see DeclareStatement
*/
declare,

/** SQL Server local table variables in queries and DML targets. */
tableVariable,
/**
* @see SetStatement
*/
Expand Down
20 changes: 20 additions & 0 deletions src/main/java/net/sf/jsqlparser/schema/Table.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ public class Table extends ASTNodeAccessImpl

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

private boolean tableVariable;

// holds the various `time travel` syntax for BigQuery, RedShift, Snowflake or RedShift
private String timeTravelStr = null;

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

public Table() {}

/** Whether this reference names a local table variable rather than a catalog table. */
public boolean isTableVariable() {
return tableVariable;
}

public void setTableVariable(boolean tableVariable) {
this.tableVariable = tableVariable;
}

public Table withTableVariable(boolean tableVariable) {
setTableVariable(tableVariable);
return this;
}

/**
* Instantiates a new Table.
*
Expand Down Expand Up @@ -527,6 +543,9 @@ public Table setResolvedTable(Table resolvedTable) {
* @return the provided table
*/
public Table setUnsetCatalogAndSchema(String currentCatalogName, String currentSchemaName) {
if (tableVariable) {
return this;
}
String databaseName = getDatabaseName();
if (databaseName == null || databaseName.isEmpty()) {
setDatabaseName(currentCatalogName);
Expand Down Expand Up @@ -561,6 +580,7 @@ public static Table[] setUnsetCatalogAndSchema(String currentCatalogName,
@Override
public Table clone() {
Table clone = new Table(this.getFullyQualifiedName());
clone.setTableVariable(tableVariable);
clone.setResolvedTable(this.resolvedTable != null ? this.resolvedTable.clone() : null);
return clone;
}
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java
Original file line number Diff line number Diff line change
Expand Up @@ -510,7 +510,9 @@ protected String extractTableName(Table table) {
@Override
public <S> Void visit(Table table, S context) {
String tableWholeName = extractTableName(table);
if (!otherItemNames.contains(tableWholeName)) {
if (table.isTableVariable()) {
otherItemNames.add(tableWholeName);
} else if (!otherItemNames.contains(tableWholeName)) {
tables.add(tableWholeName);
}
if (table.getPivot() != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ public class FeaturesAllowed implements FeatureSetValidation, ModifyableFeatureS
Feature.orderBy,
Feature.orderByNullOrdering,
Feature.tableStatement,
Feature.tableVariable,

Feature.function).unmodifyable();
/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,26 +22,20 @@
*/
public enum SqlServerVersion implements Version {
V2019("2019",
EnumSet.of(
// supported if used with jdbc
EnumSet.of(// supported if used with jdbc
Feature.jdbcParameter,
Feature.jdbcNamedParameter,
// expressions
Feature.exprLike,
// https://docs.microsoft.com/en-us/sql/t-sql/queries/select-transact-sql?view=sql-server-ver15
Feature.jdbcNamedParameter, // expressions
Feature.exprLike, // https://docs.microsoft.com/en-us/sql/t-sql/queries/select-transact-sql?view=sql-server-ver15
Feature.select,
Feature.selectInto,
Feature.withItem,
Feature.selectGroupBy, Feature.function,
// https://docs.microsoft.com/en-us/sql/t-sql/queries/from-transact-sql?view=sql-server-ver15
Feature.selectGroupBy, Feature.function, // https://docs.microsoft.com/en-us/sql/t-sql/queries/from-transact-sql?view=sql-server-ver15
// see user_defined_function
Feature.tableFunction,
Feature.selectHaving, Feature.orderBy,
Feature.distinct,
Feature.withItem, Feature.withItemRecursive,
// https://docs.microsoft.com/en-us/sql/t-sql/queries/top-transact-sql?view=sql-server-ver15
Feature.top,
// https://docs.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-ver15
Feature.withItem, Feature.withItemRecursive, // https://docs.microsoft.com/en-us/sql/t-sql/queries/top-transact-sql?view=sql-server-ver15
Feature.top, // https://docs.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-ver15
Feature.offset, Feature.offsetParam, Feature.fetch, Feature.fetchFirst,
Feature.fetchNext,

Expand All @@ -67,26 +61,19 @@ public enum SqlServerVersion implements Version {
// https://docs.microsoft.com/en-us/sql/t-sql/statements/insert-transact-sql?view=sql-server-ver15
Feature.insert,
Feature.insertValues,
Feature.insertFromSelect,
// https://docs.microsoft.com/en-us/sql/t-sql/queries/update-transact-sql?view=sql-server-ver15
Feature.insertFromSelect, // https://docs.microsoft.com/en-us/sql/t-sql/queries/update-transact-sql?view=sql-server-ver15
Feature.update,
Feature.updateFrom,

// https://docs.microsoft.com/en-us/sql/t-sql/statements/delete-transact-sql?view=sql-server-ver15
Feature.delete,
// https://docs.microsoft.com/en-us/sql/t-sql/statements/truncate-table-transact-sql?view=sql-server-ver15
Feature.delete, // https://docs.microsoft.com/en-us/sql/t-sql/statements/truncate-table-transact-sql?view=sql-server-ver15
Feature.truncate,

Feature.drop,
// https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-table-transact-sql?view=sql-server-ver15
Feature.dropTable,
// https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-index-transact-sql?view=sql-server-ver15
Feature.dropIndex,
// https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-view-transact-sql?view=sql-server-ver15
Feature.dropView,
// https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-schema-transact-sql?view=sql-server-ver15
Feature.dropSchema,
// https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-sequence-transact-sql?view=sql-server-ver15
Feature.drop, // https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-table-transact-sql?view=sql-server-ver15
Feature.dropTable, // https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-index-transact-sql?view=sql-server-ver15
Feature.dropIndex, // https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-view-transact-sql?view=sql-server-ver15
Feature.dropView, // https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-schema-transact-sql?view=sql-server-ver15
Feature.dropSchema, // https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-sequence-transact-sql?view=sql-server-ver15
Feature.dropSequence,
Feature.dropTableIfExists, Feature.dropIndexIfExists, Feature.dropViewIfExists,
Feature.dropSchemaIfExists, Feature.dropSequenceIfExists,
Expand All @@ -99,38 +86,25 @@ public enum SqlServerVersion implements Version {
Feature.set,

// https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-table-transact-sql?view=sql-server-ver15
Feature.alterTable,
// https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-sequence-transact-sql?view=sql-server-ver15
Feature.alterSequence,
// https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-view-transact-sql?view=sql-server-ver15
Feature.alterView,
// https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-index-transact-sql?view=sql-server-ver15
Feature.alterIndex,
// https://docs.microsoft.com/en-us/sql/t-sql/statements/create-index-transact-sql?view=sql-server-ver15
Feature.createIndex,
// https://docs.microsoft.com/en-us/sql/t-sql/statements/create-sequence-transact-sql?view=sql-server-ver15
Feature.createSequence,
// https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql?view=sql-server-ver15
Feature.alterTable, // https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-sequence-transact-sql?view=sql-server-ver15
Feature.alterSequence, // https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-view-transact-sql?view=sql-server-ver15
Feature.alterView, // https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-index-transact-sql?view=sql-server-ver15
Feature.alterIndex, // https://docs.microsoft.com/en-us/sql/t-sql/statements/create-index-transact-sql?view=sql-server-ver15
Feature.createIndex, // https://docs.microsoft.com/en-us/sql/t-sql/statements/create-sequence-transact-sql?view=sql-server-ver15
Feature.createSequence, // https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql?view=sql-server-ver15
Feature.createTable, Feature.createTableTableOptionStrings,
Feature.createTableFromSelect,
// https://docs.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql?view=sql-server-ver15
Feature.createTableFromSelect, // https://docs.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql?view=sql-server-ver15
// https://docs.microsoft.com/en-us/sql/t-sql/statements/create-procedure-transact-sql?view=sql-server-ver15
Feature.functionalStatement, Feature.createProcedure, Feature.createFunction,
Feature.block,
Feature.declare,
// https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql?view=sql-server-ver15
Feature.createSchema,
// https://docs.microsoft.com/en-us/sql/t-sql/statements/create-view-transact-sql?view=sql-server-ver15
Feature.createView,
// https://docs.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-ver15
Feature.createTrigger,
// https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql?view=sql-server-ver15
Feature.merge,
// https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-transact-sql?view=sql-server-ver15
Feature.grant,
// https://docs.microsoft.com/en-us/sql/t-sql/language-elements/commit-transaction-transact-sql?view=sql-server-ver15
Feature.commit,
// special sql-server features
Feature.tableVariable, // https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql?view=sql-server-ver15
Feature.createSchema, // https://docs.microsoft.com/en-us/sql/t-sql/statements/create-view-transact-sql?view=sql-server-ver15
Feature.createView, // https://docs.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-ver15
Feature.createTrigger, // https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql?view=sql-server-ver15
Feature.merge, // https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-transact-sql?view=sql-server-ver15
Feature.grant, // https://docs.microsoft.com/en-us/sql/t-sql/language-elements/commit-transaction-transact-sql?view=sql-server-ver15
Feature.commit, // special sql-server features
// https://docs.microsoft.com/en-us/sql/relational-databases/xml/for-xml-sql-server?view=sql-server-ver15
Feature.selectForXmlPath,
Feature.use, Feature.allowSquareBracketQuotation, //
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -239,8 +239,12 @@ public <S> Void visit(ParenthesedSelect selectBody, S context) {

@Override
public <S> Void visit(Table table, S context) {
validateNameWithAlias(NamedObject.table, table.getFullyQualifiedName(),
ValidationUtil.getAlias(table.getAlias()));
if (table.isTableVariable()) {
validateFeature(Feature.tableVariable);
} else {
validateNameWithAlias(NamedObject.table, table.getFullyQualifiedName(),
ValidationUtil.getAlias(table.getAlias()));
}

validateOptional(table.getPivot(), p -> p.accept(this, context));
validateOptional(table.getUnPivot(), up -> up.accept(this, context));
Expand Down
36 changes: 30 additions & 6 deletions src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
Original file line number Diff line number Diff line change
Expand Up @@ -4637,7 +4637,7 @@ Insert Insert():
<K_OVERWRITE> <K_TABLE> { insert.setOverwrite(true); insert.setTableKeyword(true); }
| <K_INTO> [ LOOKAHEAD(2) <K_TABLE> { insert.setTableKeyword(true); }]
)
] table=Table()
] table=TableReference()
[ LOOKAHEAD(2) <K_PARTITION> "(" partitions=Partitions() ")" ]

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

/** A table source or DML target; catalog-only DDL continues to use Table(). */
Table TableReference() #void :
{
Table table;
}
{
( table=TableVariable() | table=Table() )
{ return table; }
}

Table TableVariable() #TableName :
{
Token variable;
Table table;
}
{
variable=<S_AT_IDENTIFIER>
{
requireAccessSyntax(!variable.image.startsWith("@@"),
"A table variable must be a local variable");
table = new Table(variable.image, false).withTableVariable(true);
linkAST(table, jjtThis);
return table;
}
}

Table TableWithAlias():
{
Table table = null;
Alias alias = null;
}
{
table=Table()
table=TableReference()
[ LOOKAHEAD({ isAliasAhead() }) alias=Alias() { table.setAlias(alias); }]
{ return table; }
}

Table TableWithAliasAndMysqlIndexHint():
{
Table table = null;
Alias alias = null;
MySQLIndexHint indexHint = null;
}
{
table=Table()
[ LOOKAHEAD({ isAliasAhead() }) alias=Alias() { table.setAlias(alias); } ]
table=TableWithAlias()
[ LOOKAHEAD(2) indexHint=MySQLIndexHint() { table.setHint(indexHint); } ]
{ return table; }
}
Expand Down Expand Up @@ -7045,7 +7069,7 @@ FromItem FromItem() #FromItem:
|| (getToken(1).kind == K_LATERAL && getToken(2).kind != OPENING_BRACKET) })
fromItem=TableFunction()
|
LOOKAHEAD(3) fromItem=Table()
LOOKAHEAD(3) fromItem=TableReference()
|
LOOKAHEAD({ isNestedSetOperationAhead() }) (
fromItem=ParenthesedSelect()
Expand Down
Loading
Loading