Skip to content

Commit 894ab4d

Browse files
authored
Support SQL Server SET IDENTITY_INSERT with a structured table target (#2605)
1 parent f473ccf commit 894ab4d

13 files changed

Lines changed: 324 additions & 1 deletion

File tree

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,8 @@ public enum Feature {
644644
* @see UseStatement
645645
*/
646646
use,
647+
/** SQL Server session permission to insert explicit identity values into a table. */
648+
setIdentityInsert,
647649
/**
648650
* @see Grant
649651
*/
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2026 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.statement;
11+
12+
import java.util.Objects;
13+
import java.util.function.Consumer;
14+
import net.sf.jsqlparser.schema.Table;
15+
16+
/** SQL Server SET IDENTITY_INSERT [database.][schema.]table ON | OFF. */
17+
public final class SetIdentityInsertStatement implements Statement {
18+
private Table table;
19+
private boolean on;
20+
21+
public SetIdentityInsertStatement(Table table, boolean on) {
22+
setTable(table);
23+
this.on = on;
24+
}
25+
26+
public Table getTable() {
27+
return table;
28+
}
29+
30+
public void setTable(Table table) {
31+
this.table = Objects.requireNonNull(table, "table");
32+
}
33+
34+
public boolean isOn() {
35+
return on;
36+
}
37+
38+
public void setOn(boolean on) {
39+
this.on = on;
40+
}
41+
42+
/** Shares statement rendering while allowing deparsers to visit the existing Table AST. */
43+
public StringBuilder appendTo(StringBuilder builder, Consumer<Table> tableRenderer) {
44+
builder.append("SET IDENTITY_INSERT ");
45+
tableRenderer.accept(table);
46+
return builder.append(on ? " ON" : " OFF");
47+
}
48+
49+
@Override
50+
public String toString() {
51+
StringBuilder builder = new StringBuilder();
52+
return appendTo(builder, builder::append).toString();
53+
}
54+
55+
@Override
56+
public <T, S> T accept(StatementVisitor<T> statementVisitor, S context) {
57+
return statementVisitor.visit(this, context);
58+
}
59+
}

‎src/main/java/net/sf/jsqlparser/statement/StatementFeatureVisitor.java‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -715,6 +715,11 @@ public <S> Void visit(ResetStatement reset, S context) {
715715
return sessionOnly();
716716
}
717717

718+
@Override
719+
public <S> Void visit(SetIdentityInsertStatement statement, S context) {
720+
return sessionOnly();
721+
}
722+
718723
@Override
719724
public <S> Void visit(UseStatement use, S context) {
720725
return sessionOnly();

‎src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,14 @@ default void visit(Upsert upsert) {
279279
this.visit(upsert, null);
280280
}
281281

282+
default <S> T visit(SetIdentityInsertStatement statement, S context) {
283+
return null;
284+
}
285+
286+
default void visit(SetIdentityInsertStatement statement) {
287+
visit(statement, null);
288+
}
289+
282290
<S> T visit(UseStatement use, S context);
283291

284292
default void visit(UseStatement use) {

‎src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,11 @@ public <S> T visit(Upsert upsert, S context) {
486486
return null;
487487
}
488488

489+
@Override
490+
public <S> T visit(SetIdentityInsertStatement statement, S context) {
491+
return statement.getTable().accept(fromItemVisitor, context);
492+
}
493+
489494
@Override
490495
public <S> T visit(UseStatement use, S context) {
491496
return null;

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@
110110
import net.sf.jsqlparser.statement.Statements;
111111
import net.sf.jsqlparser.statement.UnsupportedStatement;
112112
import net.sf.jsqlparser.statement.UseStatement;
113+
import net.sf.jsqlparser.statement.SetIdentityInsertStatement;
113114
import net.sf.jsqlparser.statement.alter.Alter;
114115
import net.sf.jsqlparser.statement.alter.AlterSession;
115116
import net.sf.jsqlparser.statement.alter.AlterSystemStatement;
@@ -1948,6 +1949,11 @@ public void visit(Upsert upsert) {
19481949
StatementVisitor.super.visit(upsert);
19491950
}
19501951

1952+
@Override
1953+
public <S> Void visit(SetIdentityInsertStatement statement, S context) {
1954+
return statement.getTable().accept(this, context);
1955+
}
1956+
19511957
@Override
19521958
public <S> Void visit(UseStatement use, S context) {
19531959
return null;

‎src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import net.sf.jsqlparser.statement.Statements;
5555
import net.sf.jsqlparser.statement.UnsupportedStatement;
5656
import net.sf.jsqlparser.statement.UseStatement;
57+
import net.sf.jsqlparser.statement.SetIdentityInsertStatement;
5758
import net.sf.jsqlparser.statement.alter.Alter;
5859
import net.sf.jsqlparser.statement.alter.AlterSession;
5960
import net.sf.jsqlparser.statement.alter.AlterSystemStatement;
@@ -386,6 +387,11 @@ public <S> StringBuilder visit(Upsert upsert, S context) {
386387
return builder;
387388
}
388389

390+
@Override
391+
public <S> StringBuilder visit(SetIdentityInsertStatement statement, S context) {
392+
return statement.appendTo(builder, table -> table.accept(selectDeParser, context));
393+
}
394+
389395
@Override
390396
public <S> StringBuilder visit(UseStatement use, S context) {
391397
new UseStatementDeParser(builder).deParse(use);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public enum SqlServerVersion implements Version {
109109
Feature.commit, // special sql-server features
110110
// https://docs.microsoft.com/en-us/sql/relational-databases/xml/for-xml-sql-server?view=sql-server-ver15
111111
Feature.selectForXmlPath,
112-
Feature.use, Feature.allowSquareBracketQuotation, //
112+
Feature.use, Feature.setIdentityInsert, Feature.allowSquareBracketQuotation, //
113113
Feature.pivot, Feature.unpivot, Feature.pivotXml,
114114
Feature.selectGroupByGroupingSets));
115115

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2026 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.util.validation.validator;
11+
12+
import net.sf.jsqlparser.parser.feature.Feature;
13+
import net.sf.jsqlparser.statement.SetIdentityInsertStatement;
14+
import net.sf.jsqlparser.util.validation.metadata.NamedObject;
15+
16+
public class SetIdentityInsertValidator extends AbstractValidator<SetIdentityInsertStatement> {
17+
@Override
18+
public void validate(SetIdentityInsertStatement statement) {
19+
validateFeatureAndName(Feature.setIdentityInsert, NamedObject.table,
20+
statement.getTable().getFullyQualifiedName());
21+
}
22+
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import net.sf.jsqlparser.statement.Statements;
5454
import net.sf.jsqlparser.statement.UnsupportedStatement;
5555
import net.sf.jsqlparser.statement.UseStatement;
56+
import net.sf.jsqlparser.statement.SetIdentityInsertStatement;
5657
import net.sf.jsqlparser.statement.alter.Alter;
5758
import net.sf.jsqlparser.statement.alter.AlterSession;
5859
import net.sf.jsqlparser.statement.alter.AlterSystemStatement;
@@ -276,6 +277,12 @@ public <S> Void visit(Upsert upsert, S context) {
276277
return null;
277278
}
278279

280+
@Override
281+
public <S> Void visit(SetIdentityInsertStatement statement, S context) {
282+
getValidator(SetIdentityInsertValidator.class).validate(statement);
283+
return null;
284+
}
285+
279286
@Override
280287
public <S> Void visit(UseStatement use, S context) {
281288
getValidator(UseStatementValidator.class).validate(use);

0 commit comments

Comments
 (0)