Skip to content

Commit 9f51831

Browse files
feat: introduce new Parser Feature allowSkippingPartsInIdentifiers and fix the double dot occurrence at ExaSol Import statement
Signed-off-by: Andreas Reichel <andreas@manticore-projects.com>
1 parent 0c9b80e commit 9f51831

File tree

4 files changed

+88
-36
lines changed

4 files changed

+88
-36
lines changed

src/main/java/net/sf/jsqlparser/parser/AbstractJSqlParser.java

+9
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,15 @@ public P withUnparenthesizedSubSelects(boolean allowUnparenthesizedSubSelects) {
7373
return withFeature(Feature.allowUnparenthesizedSubSelects, allowUnparenthesizedSubSelects);
7474
}
7575

76+
public P withSkippingPartsInIdentifiers() {
77+
return withFeature(Feature.allowSkippingPartsInIdentifiers, true);
78+
}
79+
80+
public P withSkippingPartsInIdentifiers(boolean allowSkippingPartsInIdentifiers) {
81+
return withFeature(Feature.allowSkippingPartsInIdentifiers, allowSkippingPartsInIdentifiers);
82+
}
83+
84+
7685
public P withFeature(Feature f, boolean enabled) {
7786
getConfiguration().setValue(f, enabled);
7887
return me();

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

+4-2
Original file line numberDiff line numberDiff line change
@@ -794,9 +794,11 @@ public enum Feature {
794794
allowUnparenthesizedSubSelects(false),
795795

796796
/**
797-
* "IMPORT"
797+
* allow skipping Parts in MultiPart Identifiers, e.g `select * from dbo..test`
798+
* used in MS SQL Server and Sybase
799+
* must set to FALSE when `..` was used for different purpose, e.g. in ExaSol
798800
*/
799-
imprt,
801+
allowSkippingPartsInIdentifiers( true ),
800802
;
801803

802804
private final Object value;

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

+5-5
Original file line numberDiff line numberDiff line change
@@ -1293,15 +1293,15 @@ FileSource FileSource() #FileSource: {
12931293
{ fileSource.setConnectionFileDefinitions(connectionFileDefinitions); }
12941294

12951295
[
1296-
LOOKAHEAD(2)
1296+
LOOKAHEAD (2, { !getAsBoolean(Feature.allowSkippingPartsInIdentifiers) })
12971297
"("
12981298
(
12991299
(
13001300
{ CSVColumn csvColumn; }
13011301
(
13021302
LOOKAHEAD(2)
13031303
token=<S_LONG>
1304-
".."
1304+
"." "."
13051305
token2=<S_LONG>
13061306
{ csvColumn = new CSVColumn(Long.valueOf(token.image), Long.valueOf(token2.image)); }
13071307
| token=<S_LONG> { csvColumn = new CSVColumn(Long.valueOf(token.image)); }
@@ -1317,7 +1317,7 @@ FileSource FileSource() #FileSource: {
13171317
(
13181318
LOOKAHEAD(2)
13191319
token=<S_LONG>
1320-
".."
1320+
"." "."
13211321
token2=<S_LONG>
13221322
{ csvColumn = new CSVColumn(Long.valueOf(token.image), Long.valueOf(token2.image)); }
13231323
| token=<S_LONG> { csvColumn = new CSVColumn(Long.valueOf(token.image)); }
@@ -2663,7 +2663,7 @@ ObjectNames RelObjectNames() : {
26632663
} {
26642664
token = RelObjectNameExt() { data.add(token); }
26652665
(
2666-
LOOKAHEAD (2) ( delimiter = "." | delimiter = ":" ) { delimiters.add(delimiter.image); } (( delimiter = "." | delimiter = ":" ) { data.add(null); delimiters.add(delimiter.image); })*
2666+
LOOKAHEAD (2, { getAsBoolean(Feature.allowSkippingPartsInIdentifiers) }) ( delimiter = "." | delimiter = ":" ) { delimiters.add(delimiter.image); } (( delimiter = "." | delimiter = ":" ) { data.add(null); delimiters.add(delimiter.image); })*
26672667
token = RelObjectNameExt2() { data.add(token); }
26682668
) *
26692669

@@ -2679,7 +2679,7 @@ ObjectNames ColumnIdentifier() : {
26792679
} {
26802680
token = RelObjectNameExt() { data.add(token); }
26812681
(
2682-
LOOKAHEAD (2) ( delimiter = "." ) { delimiters.add(delimiter.image); } (( delimiter = "." ) { data.add(null); delimiters.add(delimiter.image); })*
2682+
LOOKAHEAD (2, { getAsBoolean(Feature.allowSkippingPartsInIdentifiers) }) ( delimiter = "." ) { delimiters.add(delimiter.image); } (( delimiter = "." ) { data.add(null); delimiters.add(delimiter.image); })*
26832683
token = RelObjectNameExt2() { data.add(token); }
26842684
) *
26852685

src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java

+70-29
Original file line numberDiff line numberDiff line change
@@ -140,40 +140,61 @@ public void testMultiPartTableNameWithServerProblem() throws Exception {
140140
public void testMultiPartTableNameWithServerName() throws Exception {
141141
final String statement =
142142
"SELECT columnName FROM [server-name\\server-instance]...tableName";
143-
assertSqlCanBeParsedAndDeparsed(statement, false,
144-
parser -> parser.withSquareBracketQuotation(true));
143+
assertSqlCanBeParsedAndDeparsed(
144+
statement
145+
, false
146+
,parser -> parser
147+
.withSquareBracketQuotation(true)
148+
.withSkippingPartsInIdentifiers(true)
149+
);
145150
}
146151

147152
@Test
148153
public void testMultiPartTableNameWithDatabaseNameAndSchemaName() throws Exception {
149154
final String statement = "SELECT columnName FROM databaseName.schemaName.tableName";
150-
Select select = (Select) parserManager.parse(new StringReader(statement));
151-
152-
assertStatementCanBeDeparsedAs(select, statement);
155+
assertSqlCanBeParsedAndDeparsed(
156+
statement
157+
, false
158+
,parser -> parser
159+
.withSquareBracketQuotation(true)
160+
.withSkippingPartsInIdentifiers(true)
161+
);
153162
}
154163

155164
@Test
156165
public void testMultiPartTableNameWithDatabaseName() throws Exception {
157166
final String statement = "SELECT columnName FROM databaseName..tableName";
158-
Select select = (Select) parserManager.parse(new StringReader(statement));
159-
160-
assertStatementCanBeDeparsedAs(select, statement);
167+
assertSqlCanBeParsedAndDeparsed(
168+
statement
169+
, false
170+
,parser -> parser
171+
.withSquareBracketQuotation(true)
172+
.withSkippingPartsInIdentifiers(true)
173+
);
161174
}
162175

163176
@Test
164177
public void testMultiPartTableNameWithSchemaName() throws Exception {
165178
final String statement = "SELECT columnName FROM schemaName.tableName";
166-
Select select = (Select) parserManager.parse(new StringReader(statement));
167-
168-
assertStatementCanBeDeparsedAs(select, statement);
179+
assertSqlCanBeParsedAndDeparsed(
180+
statement
181+
, false
182+
,parser -> parser
183+
.withSquareBracketQuotation(true)
184+
.withSkippingPartsInIdentifiers(true)
185+
);
169186
}
170187

171188
@Test
172189
public void testMultiPartTableNameWithColumnName() throws Exception {
173190
final String statement = "SELECT columnName FROM tableName";
174-
Select select = (Select) parserManager.parse(new StringReader(statement));
175-
176-
assertStatementCanBeDeparsedAs(select, statement);
191+
assertSqlCanBeParsedAndDeparsed(
192+
statement
193+
, false
194+
,parser -> parser
195+
.withSquareBracketQuotation(true)
196+
.withSkippingPartsInIdentifiers(true)
197+
);
177198
}
178199

179200
// Select statement statement multipart
@@ -182,9 +203,13 @@ public void testMultiPartColumnNameWithDatabaseNameAndSchemaNameAndTableName()
182203
throws Exception {
183204
final String statement =
184205
"SELECT databaseName.schemaName.tableName.columnName FROM tableName";
185-
Select select = (Select) parserManager.parse(new StringReader(statement));
186-
187-
assertStatementCanBeDeparsedAs(select, statement);
206+
assertSqlCanBeParsedAndDeparsed(
207+
statement
208+
, false
209+
,parser -> parser
210+
.withSquareBracketQuotation(true)
211+
.withSkippingPartsInIdentifiers(true)
212+
);
188213
}
189214

190215
@Test
@@ -196,9 +221,13 @@ public void testMultiPartColumnNameWithDatabaseNameAndSchemaName() throws JSQLPa
196221
@Test
197222
public void testMultiPartColumnNameWithDatabaseNameAndTableName() throws Exception {
198223
final String statement = "SELECT databaseName..tableName.columnName FROM tableName";
199-
Select select = (Select) parserManager.parse(new StringReader(statement));
200-
201-
assertStatementCanBeDeparsedAs(select, statement);
224+
Select select = (Select) assertSqlCanBeParsedAndDeparsed(
225+
statement
226+
, false
227+
,parser -> parser
228+
.withSquareBracketQuotation(true)
229+
.withSkippingPartsInIdentifiers(true)
230+
);
202231
checkMultipartIdentifier(select, "databaseName..tableName.columnName");
203232
}
204233

@@ -217,9 +246,13 @@ public void execute() throws Throwable {
217246
@Test
218247
public void testMultiPartColumnNameWithSchemaNameAndTableName() throws Exception {
219248
final String statement = "SELECT schemaName.tableName.columnName FROM tableName";
220-
Select select = (Select) parserManager.parse(new StringReader(statement));
221-
222-
assertStatementCanBeDeparsedAs(select, statement);
249+
Select select = (Select) assertSqlCanBeParsedAndDeparsed(
250+
statement
251+
, false
252+
,parser -> parser
253+
.withSquareBracketQuotation(true)
254+
.withSkippingPartsInIdentifiers(true)
255+
);
223256
checkMultipartIdentifier(select, "schemaName.tableName.columnName");
224257
}
225258

@@ -238,18 +271,26 @@ public void execute() throws Throwable {
238271
@Test
239272
public void testMultiPartColumnNameWithTableName() throws Exception {
240273
final String statement = "SELECT tableName.columnName FROM tableName";
241-
Select select = (Select) parserManager.parse(new StringReader(statement));
242-
243-
assertStatementCanBeDeparsedAs(select, statement);
274+
Select select = (Select) assertSqlCanBeParsedAndDeparsed(
275+
statement
276+
, false
277+
,parser -> parser
278+
.withSquareBracketQuotation(true)
279+
.withSkippingPartsInIdentifiers(true)
280+
);
244281
checkMultipartIdentifier(select, "tableName.columnName");
245282
}
246283

247284
@Test
248285
public void testMultiPartColumnName() throws Exception {
249286
final String statement = "SELECT columnName FROM tableName";
250-
Select select = (Select) parserManager.parse(new StringReader(statement));
251-
252-
assertStatementCanBeDeparsedAs(select, statement);
287+
Select select = (Select) assertSqlCanBeParsedAndDeparsed(
288+
statement
289+
, false
290+
,parser -> parser
291+
.withSquareBracketQuotation(true)
292+
.withSkippingPartsInIdentifiers(true)
293+
);
253294
checkMultipartIdentifier(select, "columnName");
254295
}
255296

0 commit comments

Comments
 (0)