Skip to content

Commit 6768b6c

Browse files
committed
Simplifies CREATE/ALTER EXTERNAL DATA SOURCE syntax for Fabric DW
Simplifies CREATE/ALTER EXTERNAL DATA SOURCE syntax for Fabric DW to only support the LOCATION parameter, removing support for TYPE, PUSHDOWN, and other literal/ identifier options in the Fabric DW parser. Added positive and negative tests for this based on the specification.
1 parent 10d1394 commit 6768b6c

File tree

5 files changed

+68
-165
lines changed

5 files changed

+68
-165
lines changed

SqlScriptDom/Parser/TSql/TSqlFabricDW.g

Lines changed: 2 additions & 164 deletions
Original file line numberDiff line numberDiff line change
@@ -23761,8 +23761,6 @@ dropSecurityPolicyStatement returns [DropSecurityPolicyStatement vResult = Fragm
2376123761
createExternalDataSourceStatement returns [CreateExternalDataSourceStatement vResult = FragmentFactory.CreateFragment<CreateExternalDataSourceStatement>()]
2376223762
{
2376323763
Identifier vName;
23764-
ExternalDataSourceOption vExternalDataSourceOption;
23765-
long encounteredOptions = 0;
2376623764
vResult.DataSourceType = ExternalDataSourceType.EXTERNAL_GENERICS;
2376723765
}
2376823766
: tData:Identifier tSource:Identifier vName = identifier
@@ -23774,88 +23772,15 @@ createExternalDataSourceStatement returns [CreateExternalDataSourceStatement vRe
2377423772
}
2377523773

2377623774
tWith:With LeftParenthesis
23777-
(
23778-
{NextTokenMatches(CodeGenerationSupporter.Type)}?
23779-
externalDataSourceType[vResult]
23780-
|
23781-
{NextTokenMatches(CodeGenerationSupporter.Location)}?
23782-
externalDataSourceLocation[vResult]
23783-
|
23784-
{NextTokenMatches(CodeGenerationSupporter.PushdownOption)}?
23785-
externalDataSourcePushdownOption[vResult]
23786-
|
23787-
vExternalDataSourceOption = externalDataSourceLiteralOrIdentifierOption
23788-
{
23789-
CheckOptionDuplication(ref encounteredOptions, (int)vExternalDataSourceOption.OptionKind, vExternalDataSourceOption);
23790-
AddAndUpdateTokenInfo(vResult, vResult.ExternalDataSourceOptions, vExternalDataSourceOption);
23791-
}
23792-
)
2379323775

23794-
(
23795-
tComma:Comma
23796-
(
23797-
{NextTokenMatches(CodeGenerationSupporter.Type)}?
23798-
externalDataSourceType[vResult]
23799-
|
23800-
{NextTokenMatches(CodeGenerationSupporter.Location)}?
23801-
externalDataSourceLocation[vResult]
23802-
|
23803-
{NextTokenMatches(CodeGenerationSupporter.PushdownOption)}?
23804-
externalDataSourcePushdownOption[vResult]
23805-
|
23806-
vExternalDataSourceOption = externalDataSourceLiteralOrIdentifierOption
23807-
{
23808-
CheckOptionDuplication(ref encounteredOptions, (int)vExternalDataSourceOption.OptionKind, vExternalDataSourceOption);
23809-
AddAndUpdateTokenInfo(vResult, vResult.ExternalDataSourceOptions, vExternalDataSourceOption);
23810-
}
23811-
)
23812-
)*
23776+
externalDataSourceLocation[vResult]
2381323777

2381423778
tRParen:RightParenthesis
2381523779
{
2381623780
UpdateTokenInfo(vResult,tRParen);
2381723781
}
2381823782
;
2381923783

23820-
externalDataSourceType[CreateExternalDataSourceStatement vParent]
23821-
:
23822-
tDataSourceType:Identifier EqualsSign
23823-
{
23824-
Match(tDataSourceType, CodeGenerationSupporter.Type);
23825-
UpdateTokenInfo(vParent, tDataSourceType);
23826-
}
23827-
(
23828-
tExternalDataSourceType:Identifier
23829-
{
23830-
if (TryMatch(tExternalDataSourceType, CodeGenerationSupporter.Hadoop))
23831-
{
23832-
UpdateTokenInfo(vParent, tExternalDataSourceType);
23833-
vParent.DataSourceType = ExternalDataSourceType.HADOOP;
23834-
}
23835-
else if (TryMatch(tExternalDataSourceType, CodeGenerationSupporter.Rdbms))
23836-
{
23837-
UpdateTokenInfo(vParent, tExternalDataSourceType);
23838-
vParent.DataSourceType = ExternalDataSourceType.RDBMS;
23839-
}
23840-
else if (TryMatch(tExternalDataSourceType, CodeGenerationSupporter.ShardMapManager))
23841-
{
23842-
UpdateTokenInfo(vParent, tExternalDataSourceType);
23843-
vParent.DataSourceType = ExternalDataSourceType.SHARD_MAP_MANAGER;
23844-
}
23845-
else if (TryMatch(tExternalDataSourceType, CodeGenerationSupporter.BlobStorage))
23846-
{
23847-
UpdateTokenInfo(vParent, tExternalDataSourceType);
23848-
vParent.DataSourceType = ExternalDataSourceType.BLOB_STORAGE;
23849-
}
23850-
else
23851-
{
23852-
UpdateTokenInfo(vParent, tExternalDataSourceType);
23853-
vParent.DataSourceType = ExternalDataSourceType.EXTERNAL_GENERICS;
23854-
}
23855-
}
23856-
)
23857-
;
23858-
2385923784
externalDataSourceLocation[ExternalDataSourceStatement vParent]
2386023785
{
2386123786
Literal vLocation;
@@ -23868,68 +23793,9 @@ externalDataSourceLocation[ExternalDataSourceStatement vParent]
2386823793
}
2386923794
;
2387023795

23871-
externalDataSourcePushdownOption[ExternalDataSourceStatement vParent]
23872-
:
23873-
tPushdownOption:Identifier
23874-
{
23875-
Match(tPushdownOption, CodeGenerationSupporter.PushdownOption);
23876-
UpdateTokenInfo(vParent, tPushdownOption);
23877-
}
23878-
EqualsSign
23879-
(
23880-
tOn:On
23881-
{
23882-
vParent.PushdownOption = ExternalDataSourcePushdownOption.ON;
23883-
UpdateTokenInfo(vParent, tOn);
23884-
}
23885-
| tOff:Off
23886-
{
23887-
vParent.PushdownOption = ExternalDataSourcePushdownOption.OFF;
23888-
UpdateTokenInfo(vParent, tOff);
23889-
}
23890-
)
23891-
;
23892-
23893-
externalDataSourceLiteralOrIdentifierOption returns [ExternalDataSourceLiteralOrIdentifierOption vResult = this.FragmentFactory.CreateFragment<ExternalDataSourceLiteralOrIdentifierOption>()]
23894-
{
23895-
Literal vLiteral;
23896-
Identifier vIdentifier;
23897-
}
23898-
:
23899-
tOption:Identifier
23900-
{
23901-
vResult.OptionKind = ExternalDataSourceOptionHelper.Instance.ParseOption(tOption);
23902-
}
23903-
EqualsSign
23904-
(
23905-
vIdentifier = identifier
23906-
{
23907-
if (vResult.OptionKind != ExternalDataSourceOptionKind.Credential)
23908-
{
23909-
throw GetUnexpectedTokenErrorException(tOption);
23910-
}
23911-
vResult.Value = IdentifierOrValueExpression(vIdentifier);
23912-
}
23913-
|
23914-
vLiteral = stringLiteral
23915-
{
23916-
if (vResult.OptionKind != ExternalDataSourceOptionKind.ResourceManagerLocation &&
23917-
vResult.OptionKind != ExternalDataSourceOptionKind.DatabaseName &&
23918-
vResult.OptionKind != ExternalDataSourceOptionKind.ShardMapName &&
23919-
vResult.OptionKind != ExternalDataSourceOptionKind.ConnectionOptions)
23920-
{
23921-
throw GetUnexpectedTokenErrorException(tOption);
23922-
}
23923-
vResult.Value = IdentifierOrValueExpression(vLiteral);
23924-
}
23925-
)
23926-
;
23927-
2392823796
alterExternalDataSourceStatement returns [AlterExternalDataSourceStatement vResult = FragmentFactory.CreateFragment<AlterExternalDataSourceStatement>()]
2392923797
{
2393023798
Identifier vName;
23931-
ExternalDataSourceOption vExternalDataSourceOption;
23932-
long encounteredOptions = 0;
2393323799
}
2393423800
: tData:Identifier tSource:Identifier vName = identifier
2393523801
{
@@ -23940,36 +23806,8 @@ alterExternalDataSourceStatement returns [AlterExternalDataSourceStatement vResu
2394023806
}
2394123807

2394223808
tSet:Set
23943-
(
23944-
{NextTokenMatches(CodeGenerationSupporter.Location)}?
23945-
externalDataSourceLocation[vResult]
23946-
|
23947-
{NextTokenMatches(CodeGenerationSupporter.PushdownOption)}?
23948-
externalDataSourcePushdownOption[vResult]
23949-
|
23950-
vExternalDataSourceOption = externalDataSourceLiteralOrIdentifierOption
23951-
{
23952-
CheckOptionDuplication(ref encounteredOptions, (int)vExternalDataSourceOption.OptionKind, vExternalDataSourceOption);
23953-
AddAndUpdateTokenInfo(vResult, vResult.ExternalDataSourceOptions, vExternalDataSourceOption);
23954-
}
23955-
)
2395623809

23957-
(
23958-
tComma:Comma
23959-
(
23960-
{NextTokenMatches(CodeGenerationSupporter.Location)}?
23961-
externalDataSourceLocation[vResult]
23962-
|
23963-
{NextTokenMatches(CodeGenerationSupporter.PushdownOption)}?
23964-
externalDataSourcePushdownOption[vResult]
23965-
|
23966-
vExternalDataSourceOption = externalDataSourceLiteralOrIdentifierOption
23967-
{
23968-
CheckOptionDuplication(ref encounteredOptions, (int)vExternalDataSourceOption.OptionKind, vExternalDataSourceOption);
23969-
AddAndUpdateTokenInfo(vResult, vResult.ExternalDataSourceOptions, vExternalDataSourceOption);
23970-
}
23971-
)
23972-
)*
23810+
externalDataSourceLocation[vResult]
2397323811
;
2397423812

2397523813
dropExternalDataSourceStatement returns [DropExternalDataSourceStatement vResult = FragmentFactory.CreateFragment<DropExternalDataSourceStatement>()]
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
CREATE EXTERNAL DATA SOURCE MyDataSource
2+
WITH (
3+
LOCATION = 'sqlserver://10.10.10.10:1433'
4+
);
5+
6+
CREATE EXTERNAL DATA SOURCE BlobSource
7+
WITH (
8+
LOCATION = 'wasbs://container@account.blob.core.windows.net'
9+
);
10+
11+
ALTER EXTERNAL DATA SOURCE MyDataSource SET LOCATION = 'sqlserver://192.168.1.100:1433';

Test/SqlDom/OnlyFabricDWSyntaxTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public partial class SqlDomTests
1010
private static readonly ParserTest[] OnlyFabricDWTestInfos =
1111
{
1212
new ParserTestFabricDW("CloneTableTestsFabricDW.sql", nErrors80: 4, nErrors90: 4, nErrors100: 4, nErrors110: 4, nErrors120: 4, nErrors130: 4, nErrors140: 4, nErrors150: 4, nErrors160: 4, nErrors170: 4),
13+
new ParserTestFabricDW("CreateAlterExternalDataSourceTestsFabricDW.sql", nErrors80: 2, nErrors90: 2, nErrors100: 2, nErrors110: 2, nErrors120: 2, nErrors130: 0, nErrors140: 0, nErrors150: 0, nErrors160: 0, nErrors170: 0),
1314
new ParserTestFabricDW("CreateAlterTableClusterByTestsFabricDW.sql", nErrors80: 6, nErrors90: 6, nErrors100: 6, nErrors110: 6, nErrors120: 6, nErrors130: 6, nErrors140: 6, nErrors150: 6, nErrors160: 6, nErrors170: 6),
1415
new ParserTestFabricDW("CreateExternalTableStatementTestsFabricDW.sql", nErrors80: 2, nErrors90: 2, nErrors100: 2, nErrors110: 2, nErrors120: 2, nErrors130: 2, nErrors140: 2, nErrors150: 2, nErrors160: 0, nErrors170: 0),
1516
new ParserTestFabricDW("CreateProcedureCloneTableTestsFabricDW.sql", nErrors80: 4, nErrors90: 4, nErrors100: 4, nErrors110: 4, nErrors120: 4, nErrors130: 4, nErrors140: 4, nErrors150: 4, nErrors160: 4, nErrors170: 4),
@@ -23,7 +24,7 @@ public partial class SqlDomTests
2324
new ParserTestFabricDW("AiFixGrammarTestsFabricDW.sql", nErrors80: 2, nErrors90: 1, nErrors100: 2, nErrors110: 2, nErrors120: 2, nErrors130: 0, nErrors140: 0, nErrors150: 0, nErrors160: 0, nErrors170: 0),
2425
new ParserTestFabricDW("AiGenerateResponseTestsFabricDW.sql", nErrors80: 3, nErrors90: 1, nErrors100: 2, nErrors110: 2, nErrors120: 2, nErrors130: 0, nErrors140: 0, nErrors150: 0, nErrors160: 0, nErrors170: 0),
2526
new ParserTestFabricDW("AiSummarizeTestsFabricDW.sql", nErrors80: 2, nErrors90: 1, nErrors100: 2, nErrors110: 2, nErrors120: 2, nErrors130: 0, nErrors140: 0, nErrors150: 0, nErrors160: 0, nErrors170: 0),
26-
new ParserTestFabricDW("AiTranslateTestsFabricDW.sql", nErrors80: 3, nErrors90: 1, nErrors100: 2, nErrors110: 2, nErrors120: 2, nErrors130: 0, nErrors140: 0, nErrors150: 0, nErrors160: 0, nErrors170: 0),
27+
new ParserTestFabricDW("AiTranslateTestsFabricDW.sql", nErrors80: 3, nErrors90: 1, nErrors100: 2, nErrors110: 2, nErrors120: 2, nErrors130: 0, nErrors140: 0, nErrors150: 0, nErrors160: 0, nErrors170: 0)
2728
};
2829

2930
[TestMethod]

Test/SqlDom/ParserErrorsTests.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5236,6 +5236,30 @@ public void CreateExternalDataSourceNegativeTest()
52365236
ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = RDBMS, LOCATION = someServer, DATABASE_NAME = 'someDatabase', CREDENTIAL = someCred)", new ParserErrorInfo(64, "SQL46010", "someServer"));
52375237
ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = RDBMS, LOCATION = 'someServer', DATABASE_NAME = someDatabase, CREDENTIAL = someCred)", new ParserErrorInfo(78, "SQL46010", "DATABASE_NAME"));
52385238
ParserTestUtils.ErrorTest130("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = RDBMS, LOCATION = 'someServer', DATABASE_NAME = 'someDatabase', CREDENTIAL = 'someCred')", new ParserErrorInfo(110, "SQL46010", "CREDENTIAL"));
5239+
5240+
// CREATE with TYPE parameter (no longer supported — parser expects LOCATION)
5241+
//
5242+
ParserTestUtils.ErrorTestFabricDW("CREATE EXTERNAL DATA SOURCE eds1 WITH (TYPE = HADOOP, LOCATION = 'protocol://ip_address:port')", new ParserErrorInfo(46, "SQL46010", "HADOOP"));
5243+
5244+
// CREATE with extra CREDENTIAL option after LOCATION (only LOCATION allowed, no additional options)
5245+
//
5246+
ParserTestUtils.ErrorTestFabricDW("CREATE EXTERNAL DATA SOURCE eds1 WITH (LOCATION = 'protocol://ip_address:port', CREDENTIAL = cred1)", new ParserErrorInfo(78, "SQL46010", ","));
5247+
5248+
// CREATE with extra PUSHDOWN option after LOCATION
5249+
//
5250+
ParserTestUtils.ErrorTestFabricDW("CREATE EXTERNAL DATA SOURCE eds1 WITH (LOCATION = 'protocol://ip_address:port', PUSHDOWN = ON)", new ParserErrorInfo(78, "SQL46010", ","));
5251+
5252+
// CREATE with extra RESOURCE_MANAGER_LOCATION option after LOCATION
5253+
//
5254+
ParserTestUtils.ErrorTestFabricDW("CREATE EXTERNAL DATA SOURCE eds1 WITH (LOCATION = 'protocol://ip_address:port', RESOURCE_MANAGER_LOCATION = 'ip_address:port')", new ParserErrorInfo(78, "SQL46010", ","));
5255+
5256+
// CREATE with extra DATABASE_NAME option after LOCATION
5257+
//
5258+
ParserTestUtils.ErrorTestFabricDW("CREATE EXTERNAL DATA SOURCE eds1 WITH (LOCATION = 'someServer', DATABASE_NAME = 'someDatabase')", new ParserErrorInfo(62, "SQL46010", ","));
5259+
5260+
// CREATE with extra CONNECTION_OPTIONS after LOCATION
5261+
//
5262+
ParserTestUtils.ErrorTestFabricDW("CREATE EXTERNAL DATA SOURCE eds1 WITH (LOCATION = 'protocol://ip_address:port', CONNECTION_OPTIONS = 'some_options')", new ParserErrorInfo(78, "SQL46010", ","));
52395263
}
52405264

52415265

@@ -5295,6 +5319,24 @@ public void AlterExternalDataSourceNegativeTest()
52955319
ParserTestUtils.ErrorTest130("ALTER EXTERNAL DATA SOURCE eds1 SET LOCATION = 'someServer', DATABASE_NAME = someDatabase, SHARD_MAP_NAME = 'someShardMap', CREDENTIAL = someCred", new ParserErrorInfo(61, "SQL46010", "DATABASE_NAME"));
52965320
ParserTestUtils.ErrorTest130("ALTER EXTERNAL DATA SOURCE eds1 SET LOCATION = 'someServer', DATABASE_NAME = 'someDatabase', SHARD_MAP_NAME = someShardMap, CREDENTIAL = someCred", new ParserErrorInfo(93, "SQL46010", "SHARD_MAP_NAME"));
52975321
ParserTestUtils.ErrorTest130("ALTER EXTERNAL DATA SOURCE eds1 SET LOCATION = 'someServer', DATABASE_NAME = 'someDatabase', SHARD_MAP_NAME = 'someShardMap', CREDENTIAL = 'someCred'", new ParserErrorInfo(126, "SQL46010", "CREDENTIAL"));
5322+
5323+
// ALTER with unsupported option instead of LOCATION
5324+
//
5325+
ParserTestUtils.ErrorTestFabricDW("ALTER EXTERNAL DATA SOURCE eds1 SET RESOURCE_MANAGER_LOCATION = 'ip_address:port'", new ParserErrorInfo(36, "SQL46005", "LOCATION", "RESOURCE_MANAGER_LOCATION"));
5326+
ParserTestUtils.ErrorTestFabricDW("ALTER EXTERNAL DATA SOURCE eds1 SET DATABASE_NAME = 'someDb'", new ParserErrorInfo(36, "SQL46005", "LOCATION", "DATABASE_NAME"));
5327+
ParserTestUtils.ErrorTestFabricDW("ALTER EXTERNAL DATA SOURCE eds1 SET CONNECTION_OPTIONS = 'some_options'", new ParserErrorInfo(36, "SQL46005", "LOCATION", "CONNECTION_OPTIONS"));
5328+
ParserTestUtils.ErrorTestFabricDW("ALTER EXTERNAL DATA SOURCE eds1 SET SHARD_MAP_NAME = 'someShardMap'", new ParserErrorInfo(36, "SQL46005", "LOCATION", "SHARD_MAP_NAME"));
5329+
5330+
// ALTER with unsupported option where the value is not a string literal
5331+
//
5332+
ParserTestUtils.ErrorTestFabricDW("ALTER EXTERNAL DATA SOURCE eds1 SET PUSHDOWN = ON", new ParserErrorInfo(47, "SQL46010", "ON"));
5333+
ParserTestUtils.ErrorTestFabricDW("ALTER EXTERNAL DATA SOURCE eds1 SET CREDENTIAL = cred1", new ParserErrorInfo(49, "SQL46010", "cred1"));
5334+
5335+
// ALTER with LOCATION followed by extra unsupported options (comma not expected after LOCATION value)
5336+
//
5337+
ParserTestUtils.ErrorTestFabricDW("ALTER EXTERNAL DATA SOURCE eds1 SET LOCATION = 'sqlserver://10.10.10.10:1433', PUSHDOWN = ON", new ParserErrorInfo(77, "SQL46010", ","));
5338+
ParserTestUtils.ErrorTestFabricDW("ALTER EXTERNAL DATA SOURCE eds1 SET LOCATION = 'sqlserver://10.10.10.10:1433', CREDENTIAL = cred1", new ParserErrorInfo(77, "SQL46010", ","));
5339+
ParserTestUtils.ErrorTestFabricDW("ALTER EXTERNAL DATA SOURCE eds1 SET LOCATION = 'sqlserver://10.10.10.10:1433', DATABASE_NAME = 'someDb'", new ParserErrorInfo(77, "SQL46010", ","));
52985340
}
52995341

53005342

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
CREATE EXTERNAL DATA SOURCE MyDataSource
2+
WITH (
3+
LOCATION = 'sqlserver://10.10.10.10:1433'
4+
);
5+
6+
CREATE EXTERNAL DATA SOURCE BlobSource
7+
WITH (
8+
LOCATION = 'wasbs://container@account.blob.core.windows.net'
9+
);
10+
11+
ALTER EXTERNAL DATA SOURCE MyDataSource SET LOCATION = 'sqlserver://192.168.1.100:1433';

0 commit comments

Comments
 (0)