diff --git a/SqlScriptDom/Parser/TSql/Ast.xml b/SqlScriptDom/Parser/TSql/Ast.xml index d90c664..ebf274a 100644 --- a/SqlScriptDom/Parser/TSql/Ast.xml +++ b/SqlScriptDom/Parser/TSql/Ast.xml @@ -1388,7 +1388,8 @@ - + + @@ -1404,8 +1405,8 @@ - - + + diff --git a/SqlScriptDom/Parser/TSql/ExternalModelTypeOption.cs b/SqlScriptDom/Parser/TSql/ExternalModelTypeOption.cs index 6f16dc2..0a7bfda 100644 --- a/SqlScriptDom/Parser/TSql/ExternalModelTypeOption.cs +++ b/SqlScriptDom/Parser/TSql/ExternalModelTypeOption.cs @@ -10,16 +10,15 @@ namespace Microsoft.SqlServer.TransactSql.ScriptDom #pragma warning disable 1591 /// - /// The enumeration specifies the external model type - /// Currently, we support Embeddings only. + /// The enumeration specifies the external model type. + /// Currently, we support EMBEDDINGS only. /// - public enum ExternalModelTypeOptionKind + public enum ExternalModelTypeOption { /// /// MODEL_TYPE = EMBEDDINGS /// - Embeddings = 0, - + EMBEDDINGS = 0, } #pragma warning restore 1591 diff --git a/SqlScriptDom/Parser/TSql/TSql170.g b/SqlScriptDom/Parser/TSql/TSql170.g index 0babede..ceb7860 100644 --- a/SqlScriptDom/Parser/TSql/TSql170.g +++ b/SqlScriptDom/Parser/TSql/TSql170.g @@ -24171,14 +24171,14 @@ StringLiteral vApiFormat; externalModelModelType[ExternalModelStatement vParent] { - ExternalModelTypeOption vModelTypeOption = null; + ExternalModelTypeSpecification vModelTypeSpec = null; } : tModelType:Identifier { Match(tModelType, CodeGenerationSupporter.ModelType); - vModelTypeOption = this.FragmentFactory.CreateFragment(); - UpdateTokenInfo(vModelTypeOption, tModelType); + vModelTypeSpec = this.FragmentFactory.CreateFragment(); + UpdateTokenInfo(vModelTypeSpec, tModelType); } EqualsSign ( @@ -24186,10 +24186,11 @@ externalModelModelType[ExternalModelStatement vParent] { if (TryMatch(tEmbeddings, CodeGenerationSupporter.Embeddings)) { - vModelTypeOption.OptionKind = ExternalModelTypeOptionKind.Embeddings; - UpdateTokenInfo(vModelTypeOption, tEmbeddings); - vParent.ModelType = vModelTypeOption; - vParent.UpdateTokenInfo(vModelTypeOption); + vModelTypeSpec.OptionKind = ExternalModelTypeOption.EMBEDDINGS; + UpdateTokenInfo(vModelTypeSpec, tEmbeddings); + vParent.ModelTypeSpecification = vModelTypeSpec; + vParent.ModelType = ExternalModelTypeOption.EMBEDDINGS; + vParent.UpdateTokenInfo(vModelTypeSpec); } else { diff --git a/SqlScriptDom/Parser/TSql/TSql180.g b/SqlScriptDom/Parser/TSql/TSql180.g index ae426b0..934911d 100644 --- a/SqlScriptDom/Parser/TSql/TSql180.g +++ b/SqlScriptDom/Parser/TSql/TSql180.g @@ -24400,14 +24400,14 @@ StringLiteral vApiFormat; externalModelModelType[ExternalModelStatement vParent] { - ExternalModelTypeOption vModelTypeOption = null; + ExternalModelTypeSpecification vModelTypeSpec = null; } : tModelType:Identifier { Match(tModelType, CodeGenerationSupporter.ModelType); - vModelTypeOption = this.FragmentFactory.CreateFragment(); - UpdateTokenInfo(vModelTypeOption, tModelType); + vModelTypeSpec = this.FragmentFactory.CreateFragment(); + UpdateTokenInfo(vModelTypeSpec, tModelType); } EqualsSign ( @@ -24415,10 +24415,11 @@ externalModelModelType[ExternalModelStatement vParent] { if (TryMatch(tEmbeddings, CodeGenerationSupporter.Embeddings)) { - vModelTypeOption.OptionKind = ExternalModelTypeOptionKind.Embeddings; - UpdateTokenInfo(vModelTypeOption, tEmbeddings); - vParent.ModelType = vModelTypeOption; - vParent.UpdateTokenInfo(vModelTypeOption); + vModelTypeSpec.OptionKind = ExternalModelTypeOption.EMBEDDINGS; + UpdateTokenInfo(vModelTypeSpec, tEmbeddings); + vParent.ModelTypeSpecification = vModelTypeSpec; + vParent.ModelType = ExternalModelTypeOption.EMBEDDINGS; + vParent.UpdateTokenInfo(vModelTypeSpec); } else { diff --git a/SqlScriptDom/ScriptDom/SqlServer/ScriptGenerator/SqlScriptGenerator.AlterExternalModelStatement.cs b/SqlScriptDom/ScriptDom/SqlServer/ScriptGenerator/SqlScriptGenerator.AlterExternalModelStatement.cs index 10e8a45..1d8da7a 100644 --- a/SqlScriptDom/ScriptDom/SqlServer/ScriptGenerator/SqlScriptGenerator.AlterExternalModelStatement.cs +++ b/SqlScriptDom/ScriptDom/SqlServer/ScriptGenerator/SqlScriptGenerator.AlterExternalModelStatement.cs @@ -53,7 +53,7 @@ protected void GenerateAlterExternalModelStatementBody(AlterExternalModelStateme } // external model Model Type options - if (node.ModelType != null) + if (node.ModelTypeSpecification != null) { if (!ifFirst) { @@ -61,7 +61,18 @@ protected void GenerateAlterExternalModelStatementBody(AlterExternalModelStateme } ifFirst = false; NewLine(); - GenerateFragmentIfNotNull(node.ModelType); + GenerateFragmentIfNotNull(node.ModelTypeSpecification); + } + else if (node.ModelType != null) + { + if (!ifFirst) + { + GenerateSymbol(TSqlTokenType.Comma); + } + ifFirst = false; + NewLine(); + string externalModelTypeOption = GetValueForEnumKey(_externalModelTypeOption, node.ModelType.Value); + GenerateNameEqualsValue(CodeGenerationSupporter.ModelType, externalModelTypeOption); } // external model name options diff --git a/SqlScriptDom/ScriptDom/SqlServer/ScriptGenerator/SqlScriptGeneratorVisitor.CreateExternalModelStatement.cs b/SqlScriptDom/ScriptDom/SqlServer/ScriptGenerator/SqlScriptGeneratorVisitor.CreateExternalModelStatement.cs index 8d6b317..543f15a 100644 --- a/SqlScriptDom/ScriptDom/SqlServer/ScriptGenerator/SqlScriptGeneratorVisitor.CreateExternalModelStatement.cs +++ b/SqlScriptDom/ScriptDom/SqlServer/ScriptGenerator/SqlScriptGeneratorVisitor.CreateExternalModelStatement.cs @@ -17,9 +17,9 @@ public override void ExplicitVisit(CreateExternalModelStatement node) GenerateSpaceAndIdentifier(CodeGenerationSupporter.Model); GenerateCreateExternalModelStatementBody(node); } - protected static Dictionary _externalModelTypeOptionKind = new Dictionary() + protected static Dictionary _externalModelTypeOption = new Dictionary() { - {ExternalModelTypeOptionKind.Embeddings, CodeGenerationSupporter.Embeddings} + {ExternalModelTypeOption.EMBEDDINGS, CodeGenerationSupporter.Embeddings} }; protected void GenerateCreateExternalModelStatementBody(CreateExternalModelStatement node) @@ -54,7 +54,7 @@ protected void GenerateCreateExternalModelStatementBody(CreateExternalModelState } // external model Model Type options - if (node.ModelType != null) + if (node.ModelTypeSpecification != null) { if (!ifFirst) { @@ -62,7 +62,18 @@ protected void GenerateCreateExternalModelStatementBody(CreateExternalModelState } ifFirst = false; NewLine(); - GenerateFragmentIfNotNull(node.ModelType); + GenerateFragmentIfNotNull(node.ModelTypeSpecification); + } + else if (node.ModelType != null) + { + if (!ifFirst) + { + GenerateSymbol(TSqlTokenType.Comma); + } + ifFirst = false; + NewLine(); + string externalModelTypeOption = GetValueForEnumKey(_externalModelTypeOption, node.ModelType.Value); + GenerateNameEqualsValue(CodeGenerationSupporter.ModelType, externalModelTypeOption); } // external model name options @@ -117,9 +128,9 @@ protected void GenerateCreateExternalModelStatementBody(CreateExternalModelState GenerateKeyword(TSqlTokenType.RightParenthesis); } - public override void ExplicitVisit(ExternalModelTypeOption node) + public override void ExplicitVisit(ExternalModelTypeSpecification node) { - string optionKindString = GetValueForEnumKey(_externalModelTypeOptionKind, node.OptionKind); + string optionKindString = GetValueForEnumKey(_externalModelTypeOption, node.OptionKind); GenerateNameEqualsValue(CodeGenerationSupporter.ModelType, optionKindString); } } diff --git a/Test/SqlDom/Only170SyntaxTests.cs b/Test/SqlDom/Only170SyntaxTests.cs index 51c95f3..322f993 100644 --- a/Test/SqlDom/Only170SyntaxTests.cs +++ b/Test/SqlDom/Only170SyntaxTests.cs @@ -407,18 +407,24 @@ public void TestExternalModelModelTypeVisitor() Assert.IsNotNull(fragment); // Collect all visited fragments using a custom visitor - var visitor = new ExternalModelTypeOptionVisitor(); + var visitor = new ExternalModelTypeSpecificationVisitor(); fragment.Accept(visitor); Assert.AreEqual(1, visitor.VisitedOptions.Count); - Assert.AreEqual(ExternalModelTypeOptionKind.Embeddings, visitor.VisitedOptions[0].OptionKind); + Assert.AreEqual(ExternalModelTypeOption.EMBEDDINGS, visitor.VisitedOptions[0].OptionKind); + + // Legacy enum member must still be populated for backward compatibility + var createStatement = ((TSqlScript)fragment).Batches[0].Statements[0] as CreateExternalModelStatement; + Assert.IsNotNull(createStatement); + Assert.AreEqual(ExternalModelTypeOption.EMBEDDINGS, createStatement.ModelType); + Assert.IsNotNull(createStatement.ModelTypeSpecification); } - private class ExternalModelTypeOptionVisitor : TSqlFragmentVisitor + private class ExternalModelTypeSpecificationVisitor : TSqlFragmentVisitor { - public List VisitedOptions { get; } = new List(); + public List VisitedOptions { get; } = new List(); - public override void Visit(ExternalModelTypeOption node) + public override void Visit(ExternalModelTypeSpecification node) { VisitedOptions.Add(node); base.Visit(node);