Skip to content

Commit e6c2a9a

Browse files
Add sql server override for ad hoc table
1 parent ed19cdb commit e6c2a9a

File tree

2 files changed

+21
-3
lines changed

2 files changed

+21
-3
lines changed

QueryBuilder.Tests/GeneralTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@ public void AdHoc_SingletonRow()
451451

452452
var c = Compilers.Compile(query);
453453

454-
Assert.Equal("WITH [rows] AS (SELECT 1 AS [a])\nSELECT * FROM [rows]", c[EngineCodes.SqlServer].ToString());
454+
Assert.Equal("WITH [rows] AS (SELECT [a] FROM (VALUES (1)) AS tbl ([a]))\nSELECT * FROM [rows]", c[EngineCodes.SqlServer].ToString());
455455
Assert.Equal("WITH \"rows\" AS (SELECT 1 AS \"a\")\nSELECT * FROM \"rows\"", c[EngineCodes.PostgreSql].ToString());
456456
Assert.Equal("WITH `rows` AS (SELECT 1 AS `a`)\nSELECT * FROM `rows`", c[EngineCodes.MySql].ToString());
457457
Assert.Equal("WITH \"rows\" AS (SELECT 1 AS \"a\")\nSELECT * FROM \"rows\"", c[EngineCodes.Sqlite].ToString());
@@ -471,7 +471,7 @@ public void AdHoc_TwoRows()
471471

472472
var c = Compilers.Compile(query);
473473

474-
Assert.Equal("WITH [rows] AS (SELECT 1 AS [a], 2 AS [b], 3 AS [c] UNION ALL SELECT 4 AS [a], 5 AS [b], 6 AS [c])\nSELECT * FROM [rows]", c[EngineCodes.SqlServer].ToString());
474+
Assert.Equal("WITH [rows] AS (SELECT [a], [b], [c] FROM (VALUES (1, 2, 3), (4, 5, 6)) AS tbl ([a], [b], [c]))\nSELECT * FROM [rows]", c[EngineCodes.SqlServer].ToString());
475475
Assert.Equal("WITH \"rows\" AS (SELECT 1 AS \"a\", 2 AS \"b\", 3 AS \"c\" UNION ALL SELECT 4 AS \"a\", 5 AS \"b\", 6 AS \"c\")\nSELECT * FROM \"rows\"", c[EngineCodes.PostgreSql].ToString());
476476
Assert.Equal("WITH `rows` AS (SELECT 1 AS `a`, 2 AS `b`, 3 AS `c` UNION ALL SELECT 4 AS `a`, 5 AS `b`, 6 AS `c`)\nSELECT * FROM `rows`", c[EngineCodes.MySql].ToString());
477477
Assert.Equal("WITH \"rows\" AS (SELECT 1 AS \"a\", 2 AS \"b\", 3 AS \"c\" UNION ALL SELECT 4 AS \"a\", 5 AS \"b\", 6 AS \"c\")\nSELECT * FROM \"rows\"", c[EngineCodes.Sqlite].ToString());
@@ -497,7 +497,7 @@ public void AdHoc_ProperBindingsPlacement()
497497

498498
Assert.Equal(string.Join("\n", new[] {
499499
"WITH [othercte] AS (SELECT * FROM [othertable] WHERE [othertable].[status] = 'A'),",
500-
"[rows] AS (SELECT 1 AS [a], 2 AS [b], 3 AS [c] UNION ALL SELECT 4 AS [a], 5 AS [b], 6 AS [c])",
500+
"[rows] AS (SELECT [a], [b], [c] FROM (VALUES (1, 2, 3), (4, 5, 6)) AS tbl ([a], [b], [c]))",
501501
"SELECT * FROM [rows] WHERE [rows].[foo] = 'bar' AND [rows].[baz] = 'buzz'",
502502
}), c[EngineCodes.SqlServer].ToString());
503503
}

QueryBuilder/Compilers/SqlServerCompiler.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using System.Linq;
2+
13
namespace SqlKata.Compilers
24
{
35
public class SqlServerCompiler : Compiler
@@ -168,5 +170,21 @@ protected override string CompileBasicDateCondition(SqlResult ctx, BasicDateCond
168170

169171
return sql;
170172
}
173+
174+
protected override SqlResult CompileAdHocQuery(AdHocTableFromClause adHoc)
175+
{
176+
var ctx = new SqlResult();
177+
178+
var colNames = string.Join(", ", adHoc.Columns.Select(Wrap));
179+
180+
var valueRow = string.Join(", ", Enumerable.Repeat("?", adHoc.Columns.Count));
181+
var valueRows = string.Join(", ", Enumerable.Repeat($"({valueRow})", adHoc.Values.Count / adHoc.Columns.Count));
182+
var sql = $"SELECT {colNames} FROM (VALUES {valueRows}) AS tbl ({colNames})";
183+
184+
ctx.RawSql = sql;
185+
ctx.Bindings = adHoc.Values;
186+
187+
return ctx;
188+
}
171189
}
172190
}

0 commit comments

Comments
 (0)