Skip to content

Commit 07f44b3

Browse files
committed
Fixed INSERT from SELECT CTE
1 parent 54268f3 commit 07f44b3

File tree

4 files changed

+38
-9
lines changed

4 files changed

+38
-9
lines changed

Lib/CSQLQueryExpress/Compiler/SQLQueryFragmentComparer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public int Compare(ISQLQueryFragment x, ISQLQueryFragment y)
3838
private static void AddFragmentOrders(IDictionary<SQLQueryFragmentType, IDictionary<SQLQueryFragmentType, int>> order)
3939
{
4040
order.Add(SQLQueryFragmentType.Insert, GetInsertOrder());
41+
order.Add(SQLQueryFragmentType.InsertBySelect, GetDefaultOrder());
4142
order.Add(SQLQueryFragmentType.Delete, GetDeleteOrder());
4243
order.Add(SQLQueryFragmentType.Update, GetUpdateOrder());
4344
order.Add(SQLQueryFragmentType.Truncate, GetTruncateOrder());

Lib/CSQLQueryExpress/Compiler/SQLQueryTranslator.cs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -823,17 +823,25 @@ private Expression VisitQuerySelectionMethodCall(MethodCallExpression node)
823823
}
824824
else if (node.Method.Name == nameof(SQLQuerySelectionExtension.As))
825825
{
826-
this.Visit(node.Arguments[0]);
827-
_queryBuilder.Append(" AS ");
828-
if (node.Arguments[1] is MemberExpression memberExp)
826+
if (_fragmentType == SQLQueryFragmentType.InsertValues &&
827+
node.Arguments.Count == 2)
829828
{
830-
_queryBuilder.Append(_aliasBuilder.ResolveColumnName(memberExp.Type, memberExp.Member));
829+
this.Visit(node.Arguments[1]);
831830
}
832831
else
833832
{
834-
var unaryExp = (UnaryExpression)node.Arguments[1];
835-
var opMemberExp = (MemberExpression)unaryExp.Operand;
836-
_queryBuilder.Append(_aliasBuilder.ResolveColumnName(opMemberExp.Type, opMemberExp.Member));
833+
this.Visit(node.Arguments[0]);
834+
_queryBuilder.Append(" AS ");
835+
if (node.Arguments[1] is MemberExpression memberExp)
836+
{
837+
_queryBuilder.Append(_aliasBuilder.ResolveColumnName(memberExp.Type, memberExp.Member));
838+
}
839+
else
840+
{
841+
var unaryExp = (UnaryExpression)node.Arguments[1];
842+
var opMemberExp = (MemberExpression)unaryExp.Operand;
843+
_queryBuilder.Append(_aliasBuilder.ResolveColumnName(opMemberExp.Type, opMemberExp.Member));
844+
}
837845
}
838846

839847
return node;

Lib/CSQLQueryExpress/Fragments/SQLQueryFrom.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ public string Translate(ISQLQueryTranslator expressionTranslator)
168168

169169
if (_select != null)
170170
{
171-
if (_fragments.All(f => f.FragmentType != SQLQueryFragmentType.Insert))
171+
if (_fragments.All(f => f.FragmentType != SQLQueryFragmentType.Insert && f.FragmentType != SQLQueryFragmentType.InsertBySelect))
172172
{
173173
if (_select.FragmentType == SQLQueryFragmentType.SelectCte)
174174
{
@@ -180,7 +180,7 @@ public string Translate(ISQLQueryTranslator expressionTranslator)
180180
}
181181
}
182182
}
183-
else if (_fragments.All(f => f.FragmentType != SQLQueryFragmentType.Insert && f.FragmentType != SQLQueryFragmentType.Update))
183+
else if (_fragments.All(f => f.FragmentType != SQLQueryFragmentType.Insert && f.FragmentType != SQLQueryFragmentType.InsertBySelect && f.FragmentType != SQLQueryFragmentType.Update))
184184
{
185185
if (_fragments.Any(f => f.FragmentType == SQLQueryFragmentType.Select || f.FragmentType == SQLQueryFragmentType.SelectCte))
186186
{

Tests/CSQLQueryExpress.Tests/UnitTests/QueryInsertUnitTest.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,26 @@ public void TestInsertFromSelect()
9292
Is.EqualTo(@"INSERT INTO [dbo].[Shippers] ([CompanyName], [Phone]) SELECT _t1.[CompanyName], @p0 FROM [dbo].[Customers] AS _t1"));
9393
}
9494

95+
[Test]
96+
public void TestInsertFromSelectCte()
97+
{
98+
var selectQuery = new SQLQuery()
99+
.From<dbo.Customers>()
100+
.Select(s => s.CompanyName, s => "Ciao".As(s.Phone))
101+
.ToCteTable();
102+
103+
var query = new SQLQuery()
104+
.Insert<dbo.Shippers>(selectQuery, s => s.CompanyName, s => s.Phone);
105+
106+
var compiledQuery = query.Compile();
107+
108+
Assert.That(compiledQuery.Parameters.Count, Is.EqualTo(1));
109+
Assert.That(compiledQuery.Parameters[0].Value, Is.EqualTo("Ciao"));
110+
111+
Assert.That(compiledQuery.Statement.Replace(Environment.NewLine, string.Empty),
112+
Is.EqualTo(@"WITH _t0 AS (SELECT _t0.[CompanyName], @p0 AS [Phone] FROM [dbo].[Customers] AS _t0) INSERT INTO [dbo].[Shippers] ([CompanyName], [Phone]) SELECT _t0.[CompanyName], _t0.[Phone] FROM _t1"));
113+
}
114+
95115
[Test]
96116
public void TestInsertParameters()
97117
{

0 commit comments

Comments
 (0)