From c832c528b3ac0bd8fe5c25b3b825e5a789468f64 Mon Sep 17 00:00:00 2001
From: Chad Gilbert
Date: Mon, 7 Oct 2019 23:32:12 -0400
Subject: [PATCH 01/45] Add ad-hoc default implementation
This uses the UNION ALL syntax for all compilers
---
QueryBuilder.Tests/GeneralTests.cs | 77 ++++++++++++++++++++++
QueryBuilder/Clauses/FromClause.cs | 22 +++++++
QueryBuilder/Compilers/Compiler.cs | 29 ++++++++
QueryBuilder/Compilers/FirebirdCompiler.cs | 1 +
QueryBuilder/Compilers/OracleCompiler.cs | 1 +
QueryBuilder/Query.cs | 34 ++++++++++
6 files changed, 164 insertions(+)
diff --git a/QueryBuilder.Tests/GeneralTests.cs b/QueryBuilder.Tests/GeneralTests.cs
index bbf5c464..6423a2bc 100644
--- a/QueryBuilder.Tests/GeneralTests.cs
+++ b/QueryBuilder.Tests/GeneralTests.cs
@@ -401,5 +401,82 @@ public void Where_Nested()
Assert.Equal("SELECT * FROM [table] WHERE ([a] = 1 OR [a] = 2)", c[EngineCodes.SqlServer].ToString());
}
+
+ [Fact]
+ public void AdHoc_Throws_WhenNoColumnsProvided() =>
+ Assert.Throws(() =>
+ new Query("rows").With("rows",
+ new string[0],
+ new object[][] {
+ new object[] {},
+ new object[] {},
+ }));
+
+ [Fact]
+ public void AdHoc_Throws_WhenNoValueRowsProvided() =>
+ Assert.Throws(() =>
+ new Query("rows").With("rows",
+ new[] { "a", "b", "c" },
+ new object[][] {
+ }));
+
+ [Fact]
+ public void AdHoc_Throws_WhenColumnsOutnumberFieldValues() =>
+ Assert.Throws(() =>
+ new Query("rows").With("rows",
+ new[] { "a", "b", "c", "d" },
+ new object[][] {
+ new object[] { 1, 2, 3 },
+ new object[] { 4, 5, 6 },
+ }));
+
+ [Fact]
+ public void AdHoc_Throws_WhenFieldValuesOutNumberColumns() =>
+ Assert.Throws(() =>
+ new Query("rows").With("rows",
+ new[] { "a", "b" },
+ new object[][] {
+ new object[] { 1, 2, 3 },
+ new object[] { 4, 5, 6 },
+ }));
+
+ [Fact]
+ public void AdHoc_SingletonRow()
+ {
+ var query = new Query("rows").With("rows",
+ new[] { "a" },
+ new object[][] {
+ new object[] { 1 },
+ });
+
+ var c = Compilers.Compile(query);
+
+ Assert.Equal("WITH [rows] AS (SELECT 1 AS a)\nSELECT * FROM [rows]", c[EngineCodes.SqlServer].ToString());
+ Assert.Equal("WITH \"rows\" AS (SELECT 1 AS a)\nSELECT * FROM \"rows\"", c[EngineCodes.PostgreSql].ToString());
+ Assert.Equal("WITH `rows` AS (SELECT 1 AS a)\nSELECT * FROM `rows`", c[EngineCodes.MySql].ToString());
+ Assert.Equal("WITH \"rows\" AS (SELECT 1 AS a)\nSELECT * FROM \"rows\"", c[EngineCodes.Sqlite].ToString());
+ Assert.Equal("WITH \"ROWS\" AS (SELECT 1 AS a FROM RDB$DATABASE)\nSELECT * FROM \"ROWS\"", c[EngineCodes.Firebird].ToString());
+ Assert.Equal("WITH \"rows\" AS (SELECT 1 AS a FROM DUAL)\nSELECT * FROM \"rows\"", c[EngineCodes.Oracle].ToString());
+ }
+
+ [Fact]
+ public void AdHoc_TwoRows()
+ {
+ var query = new Query("rows").With("rows",
+ new[] { "a", "b", "c" },
+ new object[][] {
+ new object[] { 1, 2, 3 },
+ new object[] { 4, 5, 6 },
+ });
+
+ var c = Compilers.Compile(query);
+
+ 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());
+ 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());
+ 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());
+ 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());
+ Assert.Equal("WITH \"ROWS\" AS (SELECT 1 AS a, 2 AS b, 3 AS c FROM RDB$DATABASE UNION ALL SELECT 4 AS a, 5 AS b, 6 AS c FROM RDB$DATABASE)\nSELECT * FROM \"ROWS\"", c[EngineCodes.Firebird].ToString());
+ Assert.Equal("WITH \"rows\" AS (SELECT 1 AS a, 2 AS b, 3 AS c FROM DUAL UNION ALL SELECT 4 AS a, 5 AS b, 6 AS c FROM DUAL)\nSELECT * FROM \"rows\"", c[EngineCodes.Oracle].ToString());
+ }
}
}
diff --git a/QueryBuilder/Clauses/FromClause.cs b/QueryBuilder/Clauses/FromClause.cs
index 9b21a50b..1410facf 100644
--- a/QueryBuilder/Clauses/FromClause.cs
+++ b/QueryBuilder/Clauses/FromClause.cs
@@ -1,4 +1,5 @@
using System;
+using System.Collections.Generic;
namespace SqlKata
{
@@ -94,4 +95,25 @@ public override AbstractClause Clone()
};
}
}
+
+ ///
+ /// Represents a FROM clause that is an ad-hoc table built with predefined values.
+ ///
+ public class AdHocTableFromClause : AbstractFrom
+ {
+ public List Columns { get; set; }
+ public List Values { get; set; }
+
+ public override AbstractClause Clone()
+ {
+ return new AdHocTableFromClause
+ {
+ Engine = Engine,
+ Alias = Alias,
+ Columns = Columns,
+ Values = Values,
+ Component = Component,
+ };
+ }
+ }
}
\ No newline at end of file
diff --git a/QueryBuilder/Compilers/Compiler.cs b/QueryBuilder/Compilers/Compiler.cs
index 47084c60..939b0e62 100644
--- a/QueryBuilder/Compilers/Compiler.cs
+++ b/QueryBuilder/Compilers/Compiler.cs
@@ -24,6 +24,7 @@ protected Compiler()
public virtual string EngineCode { get; }
+ protected virtual string SingleRowDummyTableName { get => null; }
///
/// A list of white-listed operators
@@ -209,6 +210,27 @@ protected virtual SqlResult CompileSelectQuery(Query query)
return ctx;
}
+ protected virtual SqlResult CompileAdHocQuery(AdHocTableFromClause adHoc)
+ {
+ var ctx = new SqlResult();
+
+ var row = "SELECT " + string.Join(", ", adHoc.Columns.Select(col => $"? AS {WrapIdentifiers(col)}"));
+
+ var fromTable = SingleRowDummyTableName;
+
+ if (fromTable != null)
+ {
+ row += $" FROM {fromTable}";
+ }
+
+ var rows = string.Join(" UNION ALL ", Enumerable.Repeat(row, adHoc.Values.Count / adHoc.Columns.Count));
+
+ ctx.RawSql = rows;
+ ctx.Bindings = adHoc.Values;
+
+ return ctx;
+ }
+
private SqlResult CompileDeleteQuery(Query query)
{
var ctx = new SqlResult
@@ -477,6 +499,13 @@ public virtual SqlResult CompileCte(AbstractFrom cte)
ctx.RawSql = $"{WrapValue(queryFromClause.Alias)} AS ({subCtx.RawSql})";
}
+ else if (cte is AdHocTableFromClause adHoc)
+ {
+ var subCtx = CompileAdHocQuery(adHoc);
+ ctx.Bindings.AddRange(subCtx.Bindings);
+
+ ctx.RawSql = $"{WrapValue(adHoc.Alias)} AS ({subCtx.RawSql})";
+ }
return ctx;
}
diff --git a/QueryBuilder/Compilers/FirebirdCompiler.cs b/QueryBuilder/Compilers/FirebirdCompiler.cs
index 9dc48cd6..98702dbf 100644
--- a/QueryBuilder/Compilers/FirebirdCompiler.cs
+++ b/QueryBuilder/Compilers/FirebirdCompiler.cs
@@ -11,6 +11,7 @@ public FirebirdCompiler()
}
public override string EngineCode { get; } = EngineCodes.Firebird;
+ protected override string SingleRowDummyTableName => "RDB$DATABASE";
protected override SqlResult CompileInsertQuery(Query query)
{
diff --git a/QueryBuilder/Compilers/OracleCompiler.cs b/QueryBuilder/Compilers/OracleCompiler.cs
index 84825043..6f0b0c4c 100644
--- a/QueryBuilder/Compilers/OracleCompiler.cs
+++ b/QueryBuilder/Compilers/OracleCompiler.cs
@@ -16,6 +16,7 @@ public OracleCompiler()
public override string EngineCode { get; } = EngineCodes.Oracle;
public bool UseLegacyPagination { get; set; } = false;
+ protected override string SingleRowDummyTableName => "DUAL";
protected override SqlResult CompileSelectQuery(Query query)
{
diff --git a/QueryBuilder/Query.cs b/QueryBuilder/Query.cs
index f933e2b6..dc6c6ee0 100755
--- a/QueryBuilder/Query.cs
+++ b/QueryBuilder/Query.cs
@@ -118,6 +118,40 @@ public Query With(string alias, Func fn)
return With(alias, fn.Invoke(new Query()));
}
+ ///
+ /// Constructs an ad-hoc table of the given data as a CTE.
+ ///
+ public Query With(string alias, IEnumerable columns, IEnumerable> valuesCollection)
+ {
+ var columnsList = columns?.ToList();
+ var valuesCollectionList = valuesCollection?.ToList();
+
+ if ((columnsList?.Count ?? 0) == 0 || (valuesCollectionList?.Count ?? 0) == 0)
+ {
+ throw new InvalidOperationException("Columns and valuesCollection cannot be null or empty");
+ }
+
+ var clause = new AdHocTableFromClause()
+ {
+ Alias = alias,
+ Columns = columnsList,
+ Values = new List(),
+ };
+
+ foreach (var values in valuesCollectionList)
+ {
+ var valuesList = values.ToList();
+ if (columnsList.Count != valuesList.Count)
+ {
+ throw new InvalidOperationException("Columns count should be equal to each Values count");
+ }
+
+ clause.Values.AddRange(valuesList);
+ }
+
+ return AddComponent("cte", clause);
+ }
+
public Query WithRaw(string alias, string sql, params object[] bindings)
{
return AddComponent("cte", new RawFromClause
From b5615a0aa907ec3c6531a8c0c589c49e70280742 Mon Sep 17 00:00:00 2001
From: Chad Gilbert
Date: Tue, 8 Oct 2019 11:02:29 -0400
Subject: [PATCH 02/45] Add test for proper binding placement
---
QueryBuilder.Tests/GeneralTests.cs | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/QueryBuilder.Tests/GeneralTests.cs b/QueryBuilder.Tests/GeneralTests.cs
index 6423a2bc..8d8fcfcd 100644
--- a/QueryBuilder.Tests/GeneralTests.cs
+++ b/QueryBuilder.Tests/GeneralTests.cs
@@ -478,5 +478,28 @@ public void AdHoc_TwoRows()
Assert.Equal("WITH \"ROWS\" AS (SELECT 1 AS a, 2 AS b, 3 AS c FROM RDB$DATABASE UNION ALL SELECT 4 AS a, 5 AS b, 6 AS c FROM RDB$DATABASE)\nSELECT * FROM \"ROWS\"", c[EngineCodes.Firebird].ToString());
Assert.Equal("WITH \"rows\" AS (SELECT 1 AS a, 2 AS b, 3 AS c FROM DUAL UNION ALL SELECT 4 AS a, 5 AS b, 6 AS c FROM DUAL)\nSELECT * FROM \"rows\"", c[EngineCodes.Oracle].ToString());
}
+
+ [Fact]
+ public void AdHoc_ProperBindingsPlacement()
+ {
+ var query = new Query("rows")
+ .With("othercte", q => q.From("othertable").Where("othertable.status", "A"))
+ .Where("rows.foo", "bar")
+ .With("rows",
+ new[] { "a", "b", "c" },
+ new object[][] {
+ new object[] { 1, 2, 3 },
+ new object[] { 4, 5, 6 },
+ })
+ .Where("rows.baz", "buzz");
+
+ var c = Compilers.Compile(query);
+
+ Assert.Equal(string.Join("\n", new[] {
+ "WITH [othercte] AS (SELECT * FROM [othertable] WHERE [othertable].[status] = 'A'),",
+ "[rows] AS (SELECT 1 AS a, 2 AS b, 3 AS c UNION ALL SELECT 4 AS a, 5 AS b, 6 AS c)",
+ "SELECT * FROM [rows] WHERE [rows].[foo] = 'bar' AND [rows].[baz] = 'buzz'",
+ }), c[EngineCodes.SqlServer].ToString());
+ }
}
}
From ed19cdb05188978777657aeb06bb8daceccd202f Mon Sep 17 00:00:00 2001
From: Chad Gilbert
Date: Tue, 8 Oct 2019 11:11:53 -0400
Subject: [PATCH 03/45] Properly escape column names
---
QueryBuilder.Tests/GeneralTests.cs | 26 +++++++++++++-------------
QueryBuilder/Compilers/Compiler.cs | 2 +-
2 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/QueryBuilder.Tests/GeneralTests.cs b/QueryBuilder.Tests/GeneralTests.cs
index 8d8fcfcd..4856c421 100644
--- a/QueryBuilder.Tests/GeneralTests.cs
+++ b/QueryBuilder.Tests/GeneralTests.cs
@@ -451,12 +451,12 @@ public void AdHoc_SingletonRow()
var c = Compilers.Compile(query);
- Assert.Equal("WITH [rows] AS (SELECT 1 AS a)\nSELECT * FROM [rows]", c[EngineCodes.SqlServer].ToString());
- Assert.Equal("WITH \"rows\" AS (SELECT 1 AS a)\nSELECT * FROM \"rows\"", c[EngineCodes.PostgreSql].ToString());
- Assert.Equal("WITH `rows` AS (SELECT 1 AS a)\nSELECT * FROM `rows`", c[EngineCodes.MySql].ToString());
- Assert.Equal("WITH \"rows\" AS (SELECT 1 AS a)\nSELECT * FROM \"rows\"", c[EngineCodes.Sqlite].ToString());
- Assert.Equal("WITH \"ROWS\" AS (SELECT 1 AS a FROM RDB$DATABASE)\nSELECT * FROM \"ROWS\"", c[EngineCodes.Firebird].ToString());
- Assert.Equal("WITH \"rows\" AS (SELECT 1 AS a FROM DUAL)\nSELECT * FROM \"rows\"", c[EngineCodes.Oracle].ToString());
+ Assert.Equal("WITH [rows] AS (SELECT 1 AS [a])\nSELECT * FROM [rows]", c[EngineCodes.SqlServer].ToString());
+ Assert.Equal("WITH \"rows\" AS (SELECT 1 AS \"a\")\nSELECT * FROM \"rows\"", c[EngineCodes.PostgreSql].ToString());
+ Assert.Equal("WITH `rows` AS (SELECT 1 AS `a`)\nSELECT * FROM `rows`", c[EngineCodes.MySql].ToString());
+ Assert.Equal("WITH \"rows\" AS (SELECT 1 AS \"a\")\nSELECT * FROM \"rows\"", c[EngineCodes.Sqlite].ToString());
+ Assert.Equal("WITH \"ROWS\" AS (SELECT 1 AS \"A\" FROM RDB$DATABASE)\nSELECT * FROM \"ROWS\"", c[EngineCodes.Firebird].ToString());
+ Assert.Equal("WITH \"rows\" AS (SELECT 1 AS \"a\" FROM DUAL)\nSELECT * FROM \"rows\"", c[EngineCodes.Oracle].ToString());
}
[Fact]
@@ -471,12 +471,12 @@ public void AdHoc_TwoRows()
var c = Compilers.Compile(query);
- 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());
- 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());
- 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());
- 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());
- Assert.Equal("WITH \"ROWS\" AS (SELECT 1 AS a, 2 AS b, 3 AS c FROM RDB$DATABASE UNION ALL SELECT 4 AS a, 5 AS b, 6 AS c FROM RDB$DATABASE)\nSELECT * FROM \"ROWS\"", c[EngineCodes.Firebird].ToString());
- Assert.Equal("WITH \"rows\" AS (SELECT 1 AS a, 2 AS b, 3 AS c FROM DUAL UNION ALL SELECT 4 AS a, 5 AS b, 6 AS c FROM DUAL)\nSELECT * FROM \"rows\"", c[EngineCodes.Oracle].ToString());
+ 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());
+ 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());
+ 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());
+ 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());
+ Assert.Equal("WITH \"ROWS\" AS (SELECT 1 AS \"A\", 2 AS \"B\", 3 AS \"C\" FROM RDB$DATABASE UNION ALL SELECT 4 AS \"A\", 5 AS \"B\", 6 AS \"C\" FROM RDB$DATABASE)\nSELECT * FROM \"ROWS\"", c[EngineCodes.Firebird].ToString());
+ Assert.Equal("WITH \"rows\" AS (SELECT 1 AS \"a\", 2 AS \"b\", 3 AS \"c\" FROM DUAL UNION ALL SELECT 4 AS \"a\", 5 AS \"b\", 6 AS \"c\" FROM DUAL)\nSELECT * FROM \"rows\"", c[EngineCodes.Oracle].ToString());
}
[Fact]
@@ -497,7 +497,7 @@ public void AdHoc_ProperBindingsPlacement()
Assert.Equal(string.Join("\n", new[] {
"WITH [othercte] AS (SELECT * FROM [othertable] WHERE [othertable].[status] = 'A'),",
- "[rows] AS (SELECT 1 AS a, 2 AS b, 3 AS c UNION ALL SELECT 4 AS a, 5 AS b, 6 AS c)",
+ "[rows] AS (SELECT 1 AS [a], 2 AS [b], 3 AS [c] UNION ALL SELECT 4 AS [a], 5 AS [b], 6 AS [c])",
"SELECT * FROM [rows] WHERE [rows].[foo] = 'bar' AND [rows].[baz] = 'buzz'",
}), c[EngineCodes.SqlServer].ToString());
}
diff --git a/QueryBuilder/Compilers/Compiler.cs b/QueryBuilder/Compilers/Compiler.cs
index 939b0e62..8463b425 100644
--- a/QueryBuilder/Compilers/Compiler.cs
+++ b/QueryBuilder/Compilers/Compiler.cs
@@ -214,7 +214,7 @@ protected virtual SqlResult CompileAdHocQuery(AdHocTableFromClause adHoc)
{
var ctx = new SqlResult();
- var row = "SELECT " + string.Join(", ", adHoc.Columns.Select(col => $"? AS {WrapIdentifiers(col)}"));
+ var row = "SELECT " + string.Join(", ", adHoc.Columns.Select(col => $"? AS {Wrap(col)}"));
var fromTable = SingleRowDummyTableName;
From e6c2a9ad52ba9fbd869b3a19d3a57e2f95f8afd8 Mon Sep 17 00:00:00 2001
From: Chad Gilbert
Date: Tue, 8 Oct 2019 11:25:44 -0400
Subject: [PATCH 04/45] Add sql server override for ad hoc table
---
QueryBuilder.Tests/GeneralTests.cs | 6 +++---
QueryBuilder/Compilers/SqlServerCompiler.cs | 18 ++++++++++++++++++
2 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/QueryBuilder.Tests/GeneralTests.cs b/QueryBuilder.Tests/GeneralTests.cs
index 4856c421..cacd20a8 100644
--- a/QueryBuilder.Tests/GeneralTests.cs
+++ b/QueryBuilder.Tests/GeneralTests.cs
@@ -451,7 +451,7 @@ public void AdHoc_SingletonRow()
var c = Compilers.Compile(query);
- Assert.Equal("WITH [rows] AS (SELECT 1 AS [a])\nSELECT * FROM [rows]", c[EngineCodes.SqlServer].ToString());
+ Assert.Equal("WITH [rows] AS (SELECT [a] FROM (VALUES (1)) AS tbl ([a]))\nSELECT * FROM [rows]", c[EngineCodes.SqlServer].ToString());
Assert.Equal("WITH \"rows\" AS (SELECT 1 AS \"a\")\nSELECT * FROM \"rows\"", c[EngineCodes.PostgreSql].ToString());
Assert.Equal("WITH `rows` AS (SELECT 1 AS `a`)\nSELECT * FROM `rows`", c[EngineCodes.MySql].ToString());
Assert.Equal("WITH \"rows\" AS (SELECT 1 AS \"a\")\nSELECT * FROM \"rows\"", c[EngineCodes.Sqlite].ToString());
@@ -471,7 +471,7 @@ public void AdHoc_TwoRows()
var c = Compilers.Compile(query);
- 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());
+ 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());
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());
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());
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()
Assert.Equal(string.Join("\n", new[] {
"WITH [othercte] AS (SELECT * FROM [othertable] WHERE [othertable].[status] = 'A'),",
- "[rows] AS (SELECT 1 AS [a], 2 AS [b], 3 AS [c] UNION ALL SELECT 4 AS [a], 5 AS [b], 6 AS [c])",
+ "[rows] AS (SELECT [a], [b], [c] FROM (VALUES (1, 2, 3), (4, 5, 6)) AS tbl ([a], [b], [c]))",
"SELECT * FROM [rows] WHERE [rows].[foo] = 'bar' AND [rows].[baz] = 'buzz'",
}), c[EngineCodes.SqlServer].ToString());
}
diff --git a/QueryBuilder/Compilers/SqlServerCompiler.cs b/QueryBuilder/Compilers/SqlServerCompiler.cs
index 13bc8264..60320791 100644
--- a/QueryBuilder/Compilers/SqlServerCompiler.cs
+++ b/QueryBuilder/Compilers/SqlServerCompiler.cs
@@ -1,3 +1,5 @@
+using System.Linq;
+
namespace SqlKata.Compilers
{
public class SqlServerCompiler : Compiler
@@ -168,5 +170,21 @@ protected override string CompileBasicDateCondition(SqlResult ctx, BasicDateCond
return sql;
}
+
+ protected override SqlResult CompileAdHocQuery(AdHocTableFromClause adHoc)
+ {
+ var ctx = new SqlResult();
+
+ var colNames = string.Join(", ", adHoc.Columns.Select(Wrap));
+
+ var valueRow = string.Join(", ", Enumerable.Repeat("?", adHoc.Columns.Count));
+ var valueRows = string.Join(", ", Enumerable.Repeat($"({valueRow})", adHoc.Values.Count / adHoc.Columns.Count));
+ var sql = $"SELECT {colNames} FROM (VALUES {valueRows}) AS tbl ({colNames})";
+
+ ctx.RawSql = sql;
+ ctx.Bindings = adHoc.Values;
+
+ return ctx;
+ }
}
}
From c54f509b0e802b2c79b4f63a82b80e465910023e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?=
Date: Wed, 29 Jan 2020 15:06:57 +0300
Subject: [PATCH 05/45] changing string concatenation with stringbuilder.append
in Helper.ReplaceAll
With the previous implementation, large queries took a very long time to compile.
---
QueryBuilder/Helper.cs | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/QueryBuilder/Helper.cs b/QueryBuilder/Helper.cs
index 23b77eb6..8e6b2384 100644
--- a/QueryBuilder/Helper.cs
+++ b/QueryBuilder/Helper.cs
@@ -2,6 +2,7 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
+using System.Text;
using System.Text.RegularExpressions;
namespace SqlKata
@@ -10,7 +11,7 @@ public static class Helper
{
public static bool IsArray(object value)
{
- if(value is string)
+ if (value is string)
{
return false;
}
@@ -88,8 +89,9 @@ public static string ReplaceAll(string subject, string match, Func
);
return splitted.Skip(1)
- .Select((item, index) => callback(index) + item)
- .Aggregate(splitted.First(), (left, right) => left + right);
+ .Select((item, index) => callback(index) + item)
+ .Aggregate(new StringBuilder(splitted.First()), (prev, right) => prev.Append(right))
+ .ToString();
}
public static string JoinArray(string glue, IEnumerable array)
@@ -158,13 +160,13 @@ public static IEnumerable Repeat(this string str, int count)
{
return Enumerable.Repeat(str, count);
}
-
+
public static string ReplaceIdentifierUnlessEscaped(this string input, string escapeCharacter, string identifier, string newIdentifier)
{
//Replace standard, non-escaped identifiers first
var nonEscapedRegex = new Regex($@"(?
Date: Fri, 18 Jun 2021 16:21:21 +0200
Subject: [PATCH 06/45] Ensure all files have consistent BOM markers.
---
Program/Program.cs | 2 +-
QueryBuilder.Tests/AggregateTests.cs | 2 +-
QueryBuilder.Tests/DefineTest.cs | 2 +-
QueryBuilder.Tests/ExecutionTests.cs | 2 +-
QueryBuilder.Tests/Infrastructure/TestCompilersContainer.cs | 2 +-
QueryBuilder.Tests/Infrastructure/TestSqlResultContainer.cs | 2 +-
QueryBuilder.Tests/Infrastructure/TestSupport.cs | 2 +-
QueryBuilder.Tests/InfrastructureTests.cs | 2 +-
QueryBuilder.Tests/InsertTests.cs | 2 +-
QueryBuilder.Tests/OperatorWhitelistTests.cs | 2 +-
QueryBuilder.Tests/Oracle/OracleDateConditionTests.cs | 2 +-
QueryBuilder.Tests/Oracle/OracleLegacyLimitTests.cs | 2 +-
QueryBuilder.Tests/Oracle/OracleLimitTests.cs | 2 +-
QueryBuilder.Tests/QueryBuilder.Tests.csproj | 2 +-
QueryBuilder.Tests/SelectTests.cs | 2 +-
QueryBuilder.Tests/SqlServer/NestedSelectTests.cs | 2 +-
QueryBuilder.Tests/SqlServer/SqlServerTests.cs | 2 +-
QueryBuilder.Tests/UpdateTests.cs | 2 +-
QueryBuilder/ColumnAttribute.cs | 2 +-
QueryBuilder/Compilers/EngineCodes.cs | 2 +-
QueryBuilder/Compilers/OracleCompiler.cs | 2 +-
QueryBuilder/Extensions/QueryForExtensions.cs | 2 +-
QueryBuilder/IgnoreAttribute.cs | 2 +-
QueryBuilder/Properties/AssemblyInfo.cs | 2 +-
QueryBuilder/Query.cs | 2 +-
QueryBuilder/QueryBuilder.csproj | 2 +-
SqlKata.Execution/SqlKata.Execution.csproj | 2 +-
SqlKata.Execution/XQuery.cs | 2 +-
sqlkata.sln | 2 +-
29 files changed, 29 insertions(+), 29 deletions(-)
diff --git a/Program/Program.cs b/Program/Program.cs
index 7ed6ba40..38d59f4d 100644
--- a/Program/Program.cs
+++ b/Program/Program.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using SqlKata;
using SqlKata.Compilers;
diff --git a/QueryBuilder.Tests/AggregateTests.cs b/QueryBuilder.Tests/AggregateTests.cs
index 8c12c819..68a69842 100644
--- a/QueryBuilder.Tests/AggregateTests.cs
+++ b/QueryBuilder.Tests/AggregateTests.cs
@@ -1,4 +1,4 @@
-using SqlKata.Compilers;
+using SqlKata.Compilers;
using SqlKata.Tests.Infrastructure;
using Xunit;
diff --git a/QueryBuilder.Tests/DefineTest.cs b/QueryBuilder.Tests/DefineTest.cs
index a68af920..0b5ff292 100644
--- a/QueryBuilder.Tests/DefineTest.cs
+++ b/QueryBuilder.Tests/DefineTest.cs
@@ -1,4 +1,4 @@
-using static SqlKata.Expressions;
+using static SqlKata.Expressions;
using SqlKata.Compilers;
using SqlKata.Tests.Infrastructure;
using Xunit;
diff --git a/QueryBuilder.Tests/ExecutionTests.cs b/QueryBuilder.Tests/ExecutionTests.cs
index f67c4a57..894ca193 100644
--- a/QueryBuilder.Tests/ExecutionTests.cs
+++ b/QueryBuilder.Tests/ExecutionTests.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using SqlKata.Execution;
using Xunit;
diff --git a/QueryBuilder.Tests/Infrastructure/TestCompilersContainer.cs b/QueryBuilder.Tests/Infrastructure/TestCompilersContainer.cs
index 58fe6c28..4f57501f 100644
--- a/QueryBuilder.Tests/Infrastructure/TestCompilersContainer.cs
+++ b/QueryBuilder.Tests/Infrastructure/TestCompilersContainer.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Linq;
using SqlKata.Compilers;
diff --git a/QueryBuilder.Tests/Infrastructure/TestSqlResultContainer.cs b/QueryBuilder.Tests/Infrastructure/TestSqlResultContainer.cs
index 2efbd1c9..fd40ba83 100644
--- a/QueryBuilder.Tests/Infrastructure/TestSqlResultContainer.cs
+++ b/QueryBuilder.Tests/Infrastructure/TestSqlResultContainer.cs
@@ -1,4 +1,4 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace SqlKata.Tests.Infrastructure
diff --git a/QueryBuilder.Tests/Infrastructure/TestSupport.cs b/QueryBuilder.Tests/Infrastructure/TestSupport.cs
index d701de58..9559ebe1 100644
--- a/QueryBuilder.Tests/Infrastructure/TestSupport.cs
+++ b/QueryBuilder.Tests/Infrastructure/TestSupport.cs
@@ -1,4 +1,4 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
using System.Linq;
namespace SqlKata.Tests.Infrastructure
diff --git a/QueryBuilder.Tests/InfrastructureTests.cs b/QueryBuilder.Tests/InfrastructureTests.cs
index 3085e061..d2a0480a 100644
--- a/QueryBuilder.Tests/InfrastructureTests.cs
+++ b/QueryBuilder.Tests/InfrastructureTests.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Linq;
using SqlKata.Compilers;
using SqlKata.Tests.Infrastructure;
diff --git a/QueryBuilder.Tests/InsertTests.cs b/QueryBuilder.Tests/InsertTests.cs
index 10aad0e0..a8676052 100644
--- a/QueryBuilder.Tests/InsertTests.cs
+++ b/QueryBuilder.Tests/InsertTests.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Dynamic;
diff --git a/QueryBuilder.Tests/OperatorWhitelistTests.cs b/QueryBuilder.Tests/OperatorWhitelistTests.cs
index 0381a061..b56b9521 100644
--- a/QueryBuilder.Tests/OperatorWhitelistTests.cs
+++ b/QueryBuilder.Tests/OperatorWhitelistTests.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using SqlKata.Compilers;
using Xunit;
diff --git a/QueryBuilder.Tests/Oracle/OracleDateConditionTests.cs b/QueryBuilder.Tests/Oracle/OracleDateConditionTests.cs
index 6c89d57a..6407f5ca 100644
--- a/QueryBuilder.Tests/Oracle/OracleDateConditionTests.cs
+++ b/QueryBuilder.Tests/Oracle/OracleDateConditionTests.cs
@@ -1,4 +1,4 @@
-using SqlKata.Compilers;
+using SqlKata.Compilers;
using SqlKata.Tests.Infrastructure;
using Xunit;
diff --git a/QueryBuilder.Tests/Oracle/OracleLegacyLimitTests.cs b/QueryBuilder.Tests/Oracle/OracleLegacyLimitTests.cs
index 6f19735a..500103ba 100644
--- a/QueryBuilder.Tests/Oracle/OracleLegacyLimitTests.cs
+++ b/QueryBuilder.Tests/Oracle/OracleLegacyLimitTests.cs
@@ -1,4 +1,4 @@
-using SqlKata.Compilers;
+using SqlKata.Compilers;
using SqlKata.Tests.Infrastructure;
using Xunit;
diff --git a/QueryBuilder.Tests/Oracle/OracleLimitTests.cs b/QueryBuilder.Tests/Oracle/OracleLimitTests.cs
index d6a5991e..bd05a03c 100644
--- a/QueryBuilder.Tests/Oracle/OracleLimitTests.cs
+++ b/QueryBuilder.Tests/Oracle/OracleLimitTests.cs
@@ -1,4 +1,4 @@
-using SqlKata.Compilers;
+using SqlKata.Compilers;
using SqlKata.Tests.Infrastructure;
using Xunit;
diff --git a/QueryBuilder.Tests/QueryBuilder.Tests.csproj b/QueryBuilder.Tests/QueryBuilder.Tests.csproj
index 9a988405..775844ea 100755
--- a/QueryBuilder.Tests/QueryBuilder.Tests.csproj
+++ b/QueryBuilder.Tests/QueryBuilder.Tests.csproj
@@ -1,4 +1,4 @@
-
+
net5.0
Library
diff --git a/QueryBuilder.Tests/SelectTests.cs b/QueryBuilder.Tests/SelectTests.cs
index 1b5b3133..d327eb95 100644
--- a/QueryBuilder.Tests/SelectTests.cs
+++ b/QueryBuilder.Tests/SelectTests.cs
@@ -1,4 +1,4 @@
-using SqlKata.Compilers;
+using SqlKata.Compilers;
using SqlKata.Extensions;
using SqlKata.Tests.Infrastructure;
using System;
diff --git a/QueryBuilder.Tests/SqlServer/NestedSelectTests.cs b/QueryBuilder.Tests/SqlServer/NestedSelectTests.cs
index 9495751d..8a257e8c 100644
--- a/QueryBuilder.Tests/SqlServer/NestedSelectTests.cs
+++ b/QueryBuilder.Tests/SqlServer/NestedSelectTests.cs
@@ -1,4 +1,4 @@
-using SqlKata.Compilers;
+using SqlKata.Compilers;
using SqlKata.Tests.Infrastructure;
using Xunit;
diff --git a/QueryBuilder.Tests/SqlServer/SqlServerTests.cs b/QueryBuilder.Tests/SqlServer/SqlServerTests.cs
index 56862547..5ac08e7c 100644
--- a/QueryBuilder.Tests/SqlServer/SqlServerTests.cs
+++ b/QueryBuilder.Tests/SqlServer/SqlServerTests.cs
@@ -1,4 +1,4 @@
-using SqlKata.Compilers;
+using SqlKata.Compilers;
using SqlKata.Tests.Infrastructure;
using Xunit;
diff --git a/QueryBuilder.Tests/UpdateTests.cs b/QueryBuilder.Tests/UpdateTests.cs
index 994feddc..ecc36b5b 100644
--- a/QueryBuilder.Tests/UpdateTests.cs
+++ b/QueryBuilder.Tests/UpdateTests.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Dynamic;
diff --git a/QueryBuilder/ColumnAttribute.cs b/QueryBuilder/ColumnAttribute.cs
index 9c3af6b7..35e96343 100644
--- a/QueryBuilder/ColumnAttribute.cs
+++ b/QueryBuilder/ColumnAttribute.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
namespace SqlKata
{
diff --git a/QueryBuilder/Compilers/EngineCodes.cs b/QueryBuilder/Compilers/EngineCodes.cs
index cb898b4c..9405f7f5 100644
--- a/QueryBuilder/Compilers/EngineCodes.cs
+++ b/QueryBuilder/Compilers/EngineCodes.cs
@@ -1,4 +1,4 @@
-namespace SqlKata.Compilers
+namespace SqlKata.Compilers
{
public static class EngineCodes
{
diff --git a/QueryBuilder/Compilers/OracleCompiler.cs b/QueryBuilder/Compilers/OracleCompiler.cs
index f9f95bf2..3fedf8d7 100644
--- a/QueryBuilder/Compilers/OracleCompiler.cs
+++ b/QueryBuilder/Compilers/OracleCompiler.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
diff --git a/QueryBuilder/Extensions/QueryForExtensions.cs b/QueryBuilder/Extensions/QueryForExtensions.cs
index cde10dca..08262624 100644
--- a/QueryBuilder/Extensions/QueryForExtensions.cs
+++ b/QueryBuilder/Extensions/QueryForExtensions.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using SqlKata.Compilers;
namespace SqlKata.Extensions
diff --git a/QueryBuilder/IgnoreAttribute.cs b/QueryBuilder/IgnoreAttribute.cs
index 57e08476..4174d106 100644
--- a/QueryBuilder/IgnoreAttribute.cs
+++ b/QueryBuilder/IgnoreAttribute.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
namespace SqlKata
{
diff --git a/QueryBuilder/Properties/AssemblyInfo.cs b/QueryBuilder/Properties/AssemblyInfo.cs
index 5e161ab1..d818ff75 100644
--- a/QueryBuilder/Properties/AssemblyInfo.cs
+++ b/QueryBuilder/Properties/AssemblyInfo.cs
@@ -1,3 +1,3 @@
-using System.Runtime.CompilerServices;
+using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("QueryBuilder.Tests")]
\ No newline at end of file
diff --git a/QueryBuilder/Query.cs b/QueryBuilder/Query.cs
index 1021242f..b9264b60 100755
--- a/QueryBuilder/Query.cs
+++ b/QueryBuilder/Query.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
diff --git a/QueryBuilder/QueryBuilder.csproj b/QueryBuilder/QueryBuilder.csproj
index a56fc647..ffcce676 100755
--- a/QueryBuilder/QueryBuilder.csproj
+++ b/QueryBuilder/QueryBuilder.csproj
@@ -1,4 +1,4 @@
-
+
SqlKata The C# Sql Query Builder
diff --git a/SqlKata.Execution/SqlKata.Execution.csproj b/SqlKata.Execution/SqlKata.Execution.csproj
index bb9a0a80..41c3dba2 100644
--- a/SqlKata.Execution/SqlKata.Execution.csproj
+++ b/SqlKata.Execution/SqlKata.Execution.csproj
@@ -1,4 +1,4 @@
-
+
SqlKata The C# Sql Query Builder
Adds the execution capabilities for SqlKata
diff --git a/SqlKata.Execution/XQuery.cs b/SqlKata.Execution/XQuery.cs
index 55c58f85..9d771eaa 100644
--- a/SqlKata.Execution/XQuery.cs
+++ b/SqlKata.Execution/XQuery.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Data;
using System.Linq;
using SqlKata.Compilers;
diff --git a/sqlkata.sln b/sqlkata.sln
index c6c05b67..af806183 100644
--- a/sqlkata.sln
+++ b/sqlkata.sln
@@ -1,4 +1,4 @@
-
+
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26124.0
From e72b97bed6ec8a83f8f6e42bd0d9e13837be5d04 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dani=C3=ABl=20Geelen?=
Date: Fri, 18 Jun 2021 16:21:39 +0200
Subject: [PATCH 07/45] Ensure all files have consistent line-endings.
---
Program/Program.cs | 228 ++++++++++++++++++------------------
SqlKata.Execution/XQuery.cs | 84 ++++++-------
sqlkata.sln | 158 ++++++++++++-------------
3 files changed, 235 insertions(+), 235 deletions(-)
diff --git a/Program/Program.cs b/Program/Program.cs
index 38d59f4d..9b4c2845 100644
--- a/Program/Program.cs
+++ b/Program/Program.cs
@@ -1,114 +1,114 @@
-using System;
-using System.Collections.Generic;
-using SqlKata;
-using SqlKata.Compilers;
-using SqlKata.Execution;
-using System.Data.SqlClient;
-using System.Threading.Tasks;
-using System.Linq;
-using Newtonsoft.Json;
-using Npgsql;
-using System.Data;
-using Dapper;
-using System.Data.SQLite;
-using static SqlKata.Expressions;
-using System.IO;
-
-namespace Program
-{
- class Program
- {
- private class Loan
- {
- public string Id { get; set; }
- public string Name { get; set; }
- public List Installments { get; set; } = new List();
- }
-
- private class Installment
- {
- public string Id { get; set; }
- public string LoanId { get; set; }
- public int DaysCount { get; set; }
- }
-
- static void Main(string[] args)
- {
- using (var db = SqlLiteQueryFactory())
- {
- var query = db.Query("accounts")
- .Where("balance", ">", 0)
- .GroupBy("balance")
- .Limit(10);
-
- var accounts = query.Clone().Get();
- Console.WriteLine(JsonConvert.SerializeObject(accounts, Formatting.Indented));
-
- var exists = query.Clone().Exists();
- Console.WriteLine(exists);
- }
- }
-
- private static void log(Compiler compiler, Query query)
- {
- var compiled = compiler.Compile(query);
- Console.WriteLine(compiled.ToString());
- Console.WriteLine(JsonConvert.SerializeObject(compiled.Bindings));
- }
-
- private static QueryFactory SqlLiteQueryFactory()
- {
- var compiler = new SqliteCompiler();
-
- var connection = new SQLiteConnection("Data Source=Demo.db");
-
- var db = new QueryFactory(connection, compiler);
-
- db.Logger = result =>
- {
- Console.WriteLine(result.ToString());
- };
-
- if (!File.Exists("Demo.db"))
- {
- Console.WriteLine("db not exists creating db");
-
- SQLiteConnection.CreateFile("Demo.db");
-
- db.Statement("create table accounts(id integer primary key autoincrement, name varchar, currency_id varchar, balance decimal, created_at datetime);");
- for (var i = 0; i < 10; i++)
- {
- db.Statement("insert into accounts(name, currency_id, balance, created_at) values(@name, @currency, @balance, @date)", new
- {
- name = $"Account {i}",
- currency = "USD",
- balance = 100 * i * 1.1,
- date = DateTime.UtcNow,
- });
- }
-
- }
-
- return db;
-
- }
-
- private static QueryFactory SqlServerQueryFactory()
- {
- var compiler = new PostgresCompiler();
- var connection = new SqlConnection(
- "Server=tcp:localhost,1433;Initial Catalog=Lite;User ID=sa;Password=P@ssw0rd"
- );
-
- var db = new QueryFactory(connection, compiler);
-
- db.Logger = result =>
- {
- Console.WriteLine(result.ToString());
- };
-
- return db;
- }
-
- }
-}
+using System;
+using System.Collections.Generic;
+using SqlKata;
+using SqlKata.Compilers;
+using SqlKata.Execution;
+using System.Data.SqlClient;
+using System.Threading.Tasks;
+using System.Linq;
+using Newtonsoft.Json;
+using Npgsql;
+using System.Data;
+using Dapper;
+using System.Data.SQLite;
+using static SqlKata.Expressions;
+using System.IO;
+
+namespace Program
+{
+ class Program
+ {
+ private class Loan
+ {
+ public string Id { get; set; }
+ public string Name { get; set; }
+ public List Installments { get; set; } = new List();
+ }
+
+ private class Installment
+ {
+ public string Id { get; set; }
+ public string LoanId { get; set; }
+ public int DaysCount { get; set; }
+ }
+
+ static void Main(string[] args)
+ {
+ using (var db = SqlLiteQueryFactory())
+ {
+ var query = db.Query("accounts")
+ .Where("balance", ">", 0)
+ .GroupBy("balance")
+ .Limit(10);
+
+ var accounts = query.Clone().Get();
+ Console.WriteLine(JsonConvert.SerializeObject(accounts, Formatting.Indented));
+
+ var exists = query.Clone().Exists();
+ Console.WriteLine(exists);
+ }
+ }
+
+ private static void log(Compiler compiler, Query query)
+ {
+ var compiled = compiler.Compile(query);
+ Console.WriteLine(compiled.ToString());
+ Console.WriteLine(JsonConvert.SerializeObject(compiled.Bindings));
+ }
+
+ private static QueryFactory SqlLiteQueryFactory()
+ {
+ var compiler = new SqliteCompiler();
+
+ var connection = new SQLiteConnection("Data Source=Demo.db");
+
+ var db = new QueryFactory(connection, compiler);
+
+ db.Logger = result =>
+ {
+ Console.WriteLine(result.ToString());
+ };
+
+ if (!File.Exists("Demo.db"))
+ {
+ Console.WriteLine("db not exists creating db");
+
+ SQLiteConnection.CreateFile("Demo.db");
+
+ db.Statement("create table accounts(id integer primary key autoincrement, name varchar, currency_id varchar, balance decimal, created_at datetime);");
+ for (var i = 0; i < 10; i++)
+ {
+ db.Statement("insert into accounts(name, currency_id, balance, created_at) values(@name, @currency, @balance, @date)", new
+ {
+ name = $"Account {i}",
+ currency = "USD",
+ balance = 100 * i * 1.1,
+ date = DateTime.UtcNow,
+ });
+ }
+
+ }
+
+ return db;
+
+ }
+
+ private static QueryFactory SqlServerQueryFactory()
+ {
+ var compiler = new PostgresCompiler();
+ var connection = new SqlConnection(
+ "Server=tcp:localhost,1433;Initial Catalog=Lite;User ID=sa;Password=P@ssw0rd"
+ );
+
+ var db = new QueryFactory(connection, compiler);
+
+ db.Logger = result =>
+ {
+ Console.WriteLine(result.ToString());
+ };
+
+ return db;
+ }
+
+ }
+}
diff --git a/SqlKata.Execution/XQuery.cs b/SqlKata.Execution/XQuery.cs
index 9d771eaa..b9265fd9 100644
--- a/SqlKata.Execution/XQuery.cs
+++ b/SqlKata.Execution/XQuery.cs
@@ -1,42 +1,42 @@
-using System;
-using System.Data;
-using System.Linq;
-using SqlKata.Compilers;
-
-namespace SqlKata.Execution
-{
- public class XQuery : Query
- {
- public IDbConnection Connection { get; set; }
- public Compiler Compiler { get; set; }
- public Action Logger = result => { };
- public QueryFactory QueryFactory { get; set; }
-
- public XQuery(IDbConnection connection, Compiler compiler)
- {
- this.Connection = connection;
- this.Compiler = compiler;
- }
-
- public override Query Clone()
- {
-
- var query = new XQuery(this.Connection, this.Compiler);
-
- query.Clauses = this.Clauses.Select(x => x.Clone()).ToList();
- query.Logger = this.Logger;
-
- query.QueryAlias = QueryAlias;
- query.IsDistinct = IsDistinct;
- query.Method = Method;
- query.Includes = Includes;
- query.Variables = Variables;
-
- query.SetEngineScope(EngineScope);
-
- return query;
- }
-
- }
-
-}
+using System;
+using System.Data;
+using System.Linq;
+using SqlKata.Compilers;
+
+namespace SqlKata.Execution
+{
+ public class XQuery : Query
+ {
+ public IDbConnection Connection { get; set; }
+ public Compiler Compiler { get; set; }
+ public Action Logger = result => { };
+ public QueryFactory QueryFactory { get; set; }
+
+ public XQuery(IDbConnection connection, Compiler compiler)
+ {
+ this.Connection = connection;
+ this.Compiler = compiler;
+ }
+
+ public override Query Clone()
+ {
+
+ var query = new XQuery(this.Connection, this.Compiler);
+
+ query.Clauses = this.Clauses.Select(x => x.Clone()).ToList();
+ query.Logger = this.Logger;
+
+ query.QueryAlias = QueryAlias;
+ query.IsDistinct = IsDistinct;
+ query.Method = Method;
+ query.Includes = Includes;
+ query.Variables = Variables;
+
+ query.SetEngineScope(EngineScope);
+
+ return query;
+ }
+
+ }
+
+}
diff --git a/sqlkata.sln b/sqlkata.sln
index af806183..32820701 100644
--- a/sqlkata.sln
+++ b/sqlkata.sln
@@ -1,79 +1,79 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.26124.0
-MinimumVisualStudioVersion = 15.0.26124.0
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "QueryBuilder", "QueryBuilder\QueryBuilder.csproj", "{2D0657E1-7046-4B45-BAF3-90291BD74E0B}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "QueryBuilder.Tests", "QueryBuilder.Tests\QueryBuilder.Tests.csproj", "{61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlKata.Execution", "SqlKata.Execution\SqlKata.Execution.csproj", "{B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Program", "Program\Program.csproj", "{5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Debug|x64 = Debug|x64
- Debug|x86 = Debug|x86
- Release|Any CPU = Release|Any CPU
- Release|x64 = Release|x64
- Release|x86 = Release|x86
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {2D0657E1-7046-4B45-BAF3-90291BD74E0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {2D0657E1-7046-4B45-BAF3-90291BD74E0B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2D0657E1-7046-4B45-BAF3-90291BD74E0B}.Debug|x64.ActiveCfg = Debug|Any CPU
- {2D0657E1-7046-4B45-BAF3-90291BD74E0B}.Debug|x64.Build.0 = Debug|Any CPU
- {2D0657E1-7046-4B45-BAF3-90291BD74E0B}.Debug|x86.ActiveCfg = Debug|Any CPU
- {2D0657E1-7046-4B45-BAF3-90291BD74E0B}.Debug|x86.Build.0 = Debug|Any CPU
- {2D0657E1-7046-4B45-BAF3-90291BD74E0B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {2D0657E1-7046-4B45-BAF3-90291BD74E0B}.Release|Any CPU.Build.0 = Release|Any CPU
- {2D0657E1-7046-4B45-BAF3-90291BD74E0B}.Release|x64.ActiveCfg = Release|Any CPU
- {2D0657E1-7046-4B45-BAF3-90291BD74E0B}.Release|x64.Build.0 = Release|Any CPU
- {2D0657E1-7046-4B45-BAF3-90291BD74E0B}.Release|x86.ActiveCfg = Release|Any CPU
- {2D0657E1-7046-4B45-BAF3-90291BD74E0B}.Release|x86.Build.0 = Release|Any CPU
- {61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}.Debug|x64.ActiveCfg = Debug|Any CPU
- {61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}.Debug|x64.Build.0 = Debug|Any CPU
- {61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}.Debug|x86.ActiveCfg = Debug|Any CPU
- {61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}.Debug|x86.Build.0 = Debug|Any CPU
- {61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}.Release|Any CPU.Build.0 = Release|Any CPU
- {61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}.Release|x64.ActiveCfg = Release|Any CPU
- {61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}.Release|x64.Build.0 = Release|Any CPU
- {61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}.Release|x86.ActiveCfg = Release|Any CPU
- {61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}.Release|x86.Build.0 = Release|Any CPU
- {B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}.Debug|x64.ActiveCfg = Debug|Any CPU
- {B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}.Debug|x64.Build.0 = Debug|Any CPU
- {B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}.Debug|x86.ActiveCfg = Debug|Any CPU
- {B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}.Debug|x86.Build.0 = Debug|Any CPU
- {B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}.Release|Any CPU.Build.0 = Release|Any CPU
- {B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}.Release|x64.ActiveCfg = Release|Any CPU
- {B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}.Release|x64.Build.0 = Release|Any CPU
- {B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}.Release|x86.ActiveCfg = Release|Any CPU
- {B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}.Release|x86.Build.0 = Release|Any CPU
- {5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}.Debug|x64.ActiveCfg = Debug|Any CPU
- {5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}.Debug|x64.Build.0 = Debug|Any CPU
- {5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}.Debug|x86.ActiveCfg = Debug|Any CPU
- {5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}.Debug|x86.Build.0 = Debug|Any CPU
- {5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}.Release|Any CPU.Build.0 = Release|Any CPU
- {5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}.Release|x64.ActiveCfg = Release|Any CPU
- {5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}.Release|x64.Build.0 = Release|Any CPU
- {5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}.Release|x86.ActiveCfg = Release|Any CPU
- {5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}.Release|x86.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {8FFC834B-6CAA-409C-8E6A-43D4FB187669}
- EndGlobalSection
-EndGlobal
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26124.0
+MinimumVisualStudioVersion = 15.0.26124.0
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "QueryBuilder", "QueryBuilder\QueryBuilder.csproj", "{2D0657E1-7046-4B45-BAF3-90291BD74E0B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "QueryBuilder.Tests", "QueryBuilder.Tests\QueryBuilder.Tests.csproj", "{61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlKata.Execution", "SqlKata.Execution\SqlKata.Execution.csproj", "{B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Program", "Program\Program.csproj", "{5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {2D0657E1-7046-4B45-BAF3-90291BD74E0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2D0657E1-7046-4B45-BAF3-90291BD74E0B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2D0657E1-7046-4B45-BAF3-90291BD74E0B}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {2D0657E1-7046-4B45-BAF3-90291BD74E0B}.Debug|x64.Build.0 = Debug|Any CPU
+ {2D0657E1-7046-4B45-BAF3-90291BD74E0B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {2D0657E1-7046-4B45-BAF3-90291BD74E0B}.Debug|x86.Build.0 = Debug|Any CPU
+ {2D0657E1-7046-4B45-BAF3-90291BD74E0B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2D0657E1-7046-4B45-BAF3-90291BD74E0B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2D0657E1-7046-4B45-BAF3-90291BD74E0B}.Release|x64.ActiveCfg = Release|Any CPU
+ {2D0657E1-7046-4B45-BAF3-90291BD74E0B}.Release|x64.Build.0 = Release|Any CPU
+ {2D0657E1-7046-4B45-BAF3-90291BD74E0B}.Release|x86.ActiveCfg = Release|Any CPU
+ {2D0657E1-7046-4B45-BAF3-90291BD74E0B}.Release|x86.Build.0 = Release|Any CPU
+ {61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}.Debug|x64.Build.0 = Debug|Any CPU
+ {61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}.Debug|x86.Build.0 = Debug|Any CPU
+ {61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}.Release|Any CPU.Build.0 = Release|Any CPU
+ {61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}.Release|x64.ActiveCfg = Release|Any CPU
+ {61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}.Release|x64.Build.0 = Release|Any CPU
+ {61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}.Release|x86.ActiveCfg = Release|Any CPU
+ {61B3CBF1-7471-4F7B-B4AE-8D7F1E124371}.Release|x86.Build.0 = Release|Any CPU
+ {B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}.Debug|x64.Build.0 = Debug|Any CPU
+ {B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}.Debug|x86.Build.0 = Debug|Any CPU
+ {B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}.Release|x64.ActiveCfg = Release|Any CPU
+ {B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}.Release|x64.Build.0 = Release|Any CPU
+ {B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}.Release|x86.ActiveCfg = Release|Any CPU
+ {B6DF0569-6040-4EAF-A38B-E4DEB8DC76E0}.Release|x86.Build.0 = Release|Any CPU
+ {5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}.Debug|x64.Build.0 = Debug|Any CPU
+ {5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}.Debug|x86.Build.0 = Debug|Any CPU
+ {5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}.Release|x64.ActiveCfg = Release|Any CPU
+ {5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}.Release|x64.Build.0 = Release|Any CPU
+ {5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}.Release|x86.ActiveCfg = Release|Any CPU
+ {5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}.Release|x86.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {8FFC834B-6CAA-409C-8E6A-43D4FB187669}
+ EndGlobalSection
+EndGlobal
From 1b3545c4bef204275115bdd9b291c9726597d5c4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dani=C3=ABl=20Geelen?=
Date: Wed, 5 May 2021 09:55:24 +0200
Subject: [PATCH 08/45] Add .editorconfig to help maintain line endings.
---
.editorconfig | 5 +++++
sqlkata.sln | 5 +++++
2 files changed, 10 insertions(+)
create mode 100755 .editorconfig
diff --git a/.editorconfig b/.editorconfig
new file mode 100755
index 00000000..87f877b2
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,5 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
diff --git a/sqlkata.sln b/sqlkata.sln
index 32820701..957e67a0 100644
--- a/sqlkata.sln
+++ b/sqlkata.sln
@@ -11,6 +11,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlKata.Execution", "SqlKat
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Program", "Program\Program.csproj", "{5DEA7DBC-5B8A-44A9-A070-55E95881A4CF}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{86D00525-7428-4DD7-914D-0A10D5C53EDE}"
+ ProjectSection(SolutionItems) = preProject
+ .editorconfig = .editorconfig
+ EndProjectSection
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
From 8e1d961f0e8b3695817c9696e465fb9d7baa03f0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dani=C3=ABl=20Geelen?=
Date: Wed, 5 May 2021 09:39:32 +0200
Subject: [PATCH 09/45] Ensure new-lines-before-eof are present.
---
.github/workflows/build.yml | 2 +-
.vscode/launch.json | 2 +-
.vscode/tasks.json | 2 +-
QueryBuilder.Tests/ExecutionTests.cs | 2 +-
QueryBuilder.Tests/Firebird/FirebirdLimitTests.cs | 2 +-
QueryBuilder.Tests/HelperTests.cs | 2 +-
QueryBuilder.Tests/Infrastructure/TestCompiler.cs | 2 +-
QueryBuilder.Tests/Infrastructure/TestCompilersContainer.cs | 2 +-
QueryBuilder.Tests/Infrastructure/TestSqlResultContainer.cs | 2 +-
QueryBuilder.Tests/Infrastructure/TestSupport.cs | 2 +-
QueryBuilder.Tests/InfrastructureTests.cs | 2 +-
QueryBuilder.Tests/InsertTests.cs | 2 +-
QueryBuilder.Tests/MySql/MySqlLimitTests.cs | 2 +-
QueryBuilder.Tests/OperatorWhitelistTests.cs | 2 +-
QueryBuilder.Tests/Oracle/OracleLegacyLimitTests.cs | 2 +-
QueryBuilder.Tests/Oracle/OracleLimitTests.cs | 2 +-
QueryBuilder.Tests/ParameterTypeTests.cs | 2 +-
QueryBuilder.Tests/PostgreSql/PostgreSqlLimitTests.cs | 2 +-
QueryBuilder.Tests/SqlServer/NestedSelectTests.cs | 2 +-
QueryBuilder.Tests/SqlServer/SqlServerLegacyLimitTests.cs | 2 +-
QueryBuilder.Tests/SqlServer/SqlServerLimitTests.cs | 2 +-
QueryBuilder.Tests/SqlServer/SqlServerTests.cs | 2 +-
QueryBuilder.Tests/Sqlite/SqliteLimitTests.cs | 2 +-
QueryBuilder.Tests/UpdateTests.cs | 2 +-
QueryBuilder/BaseQuery.cs | 2 +-
QueryBuilder/Clauses/AbstractClause.cs | 2 +-
QueryBuilder/Clauses/AggregateClause.cs | 2 +-
QueryBuilder/Clauses/ColumnClause.cs | 2 +-
QueryBuilder/Clauses/Combine.cs | 2 +-
QueryBuilder/Clauses/ConditionClause.cs | 2 +-
QueryBuilder/Clauses/FromClause.cs | 2 +-
QueryBuilder/Clauses/InsertClause.cs | 2 +-
QueryBuilder/Clauses/JoinClause.cs | 2 +-
QueryBuilder/Clauses/LimitClause.cs | 2 +-
QueryBuilder/Clauses/OffsetClause.cs | 2 +-
QueryBuilder/Clauses/OrderClause.cs | 2 +-
QueryBuilder/Compilers/ConditionsCompilerProvider.cs | 2 +-
QueryBuilder/Compilers/MySqlCompiler.cs | 2 +-
QueryBuilder/Expressions.cs | 2 +-
QueryBuilder/Extensions/QueryForExtensions.cs | 2 +-
QueryBuilder/Helper.cs | 2 +-
QueryBuilder/Include.cs | 2 +-
QueryBuilder/Join.cs | 2 +-
QueryBuilder/Properties/AssemblyInfo.cs | 2 +-
QueryBuilder/Query.Aggregate.cs | 2 +-
QueryBuilder/Query.Combine.cs | 2 +-
QueryBuilder/Query.Delete.cs | 2 +-
QueryBuilder/Query.Having.cs | 2 +-
QueryBuilder/Query.Join.cs | 2 +-
QueryBuilder/Query.Select.cs | 2 +-
QueryBuilder/SqlResult.cs | 2 +-
QueryBuilder/UnsafeLiteral.cs | 2 +-
QueryBuilder/Variable.cs | 2 +-
SqlKata.Execution/InsertGetId.cs | 2 +-
SqlKata.Execution/PaginationIterator.cs | 2 +-
SqlKata.Execution/PaginationResult.cs | 2 +-
SqlKata.Execution/Query.Extensions.cs | 2 +-
SqlKata.Execution/QueryFactory.cs | 2 +-
58 files changed, 58 insertions(+), 58 deletions(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 7ba9fdb9..485e7079 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -112,4 +112,4 @@ jobs:
- name: Push to GitHub Feed
run: dotnet nuget push ./nupkg/*.nupkg --skip-duplicate --source $GITHUB_FEED --api-key $GITHUB_TOKEN
- name: Push to NuGet Feed
- run: dotnet nuget push ./nupkg/*.nupkg --skip-duplicate --source $NUGET_FEED --api-key $NUGET_KEY
\ No newline at end of file
+ run: dotnet nuget push ./nupkg/*.nupkg --skip-duplicate --source $NUGET_FEED --api-key $NUGET_KEY
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 3f3e6ff4..0770d69f 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -25,4 +25,4 @@
"processId": "${command:pickProcess}"
}
,]
-}
\ No newline at end of file
+}
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index 09e616d6..14c8f5ab 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -12,4 +12,4 @@
"problemMatcher": "$msCompile"
}
]
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder.Tests/ExecutionTests.cs b/QueryBuilder.Tests/ExecutionTests.cs
index 894ca193..7bcea9fc 100644
--- a/QueryBuilder.Tests/ExecutionTests.cs
+++ b/QueryBuilder.Tests/ExecutionTests.cs
@@ -15,4 +15,4 @@ public void ShouldThrowException()
});
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder.Tests/Firebird/FirebirdLimitTests.cs b/QueryBuilder.Tests/Firebird/FirebirdLimitTests.cs
index 2e202e43..5eda1d97 100644
--- a/QueryBuilder.Tests/Firebird/FirebirdLimitTests.cs
+++ b/QueryBuilder.Tests/Firebird/FirebirdLimitTests.cs
@@ -52,4 +52,4 @@ public void LimitAndOffset()
Assert.Equal(2, ctx.Bindings.Count);
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder.Tests/HelperTests.cs b/QueryBuilder.Tests/HelperTests.cs
index bbc31108..11a9fd4e 100644
--- a/QueryBuilder.Tests/HelperTests.cs
+++ b/QueryBuilder.Tests/HelperTests.cs
@@ -234,4 +234,4 @@ public void WrapIdentifiers(string input, string escapeCharacter, string identif
Assert.Equal(expected, result);
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder.Tests/Infrastructure/TestCompiler.cs b/QueryBuilder.Tests/Infrastructure/TestCompiler.cs
index acec3c2f..2f5a845e 100644
--- a/QueryBuilder.Tests/Infrastructure/TestCompiler.cs
+++ b/QueryBuilder.Tests/Infrastructure/TestCompiler.cs
@@ -48,4 +48,4 @@ public virtual MethodInfo Call_FindCompilerMethodInfo(Type clauseType, string me
return FindCompilerMethodInfo(clauseType, methodName);
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder.Tests/Infrastructure/TestCompilersContainer.cs b/QueryBuilder.Tests/Infrastructure/TestCompilersContainer.cs
index 4f57501f..4639ee7e 100644
--- a/QueryBuilder.Tests/Infrastructure/TestCompilersContainer.cs
+++ b/QueryBuilder.Tests/Infrastructure/TestCompilersContainer.cs
@@ -103,4 +103,4 @@ public TestSqlResultContainer Compile(Query query)
return new TestSqlResultContainer(resultKeyValues);
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder.Tests/Infrastructure/TestSqlResultContainer.cs b/QueryBuilder.Tests/Infrastructure/TestSqlResultContainer.cs
index fd40ba83..16a5eeff 100644
--- a/QueryBuilder.Tests/Infrastructure/TestSqlResultContainer.cs
+++ b/QueryBuilder.Tests/Infrastructure/TestSqlResultContainer.cs
@@ -10,4 +10,4 @@ public TestSqlResultContainer(IDictionary dictionary) : base(
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder.Tests/Infrastructure/TestSupport.cs b/QueryBuilder.Tests/Infrastructure/TestSupport.cs
index 9559ebe1..78d912cc 100644
--- a/QueryBuilder.Tests/Infrastructure/TestSupport.cs
+++ b/QueryBuilder.Tests/Infrastructure/TestSupport.cs
@@ -17,4 +17,4 @@ protected IReadOnlyDictionary Compile(Query query)
return Compilers.Compile(query).ToDictionary(s => s.Key, v => v.Value.ToString());
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder.Tests/InfrastructureTests.cs b/QueryBuilder.Tests/InfrastructureTests.cs
index d2a0480a..0cc4b085 100644
--- a/QueryBuilder.Tests/InfrastructureTests.cs
+++ b/QueryBuilder.Tests/InfrastructureTests.cs
@@ -51,4 +51,4 @@ public void ShouldThrowIfAnyEngineCodesAreInvalid()
Assert.Throws(() => Compilers.Compile(codes, new Query()));
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder.Tests/InsertTests.cs b/QueryBuilder.Tests/InsertTests.cs
index a8676052..1451b951 100644
--- a/QueryBuilder.Tests/InsertTests.cs
+++ b/QueryBuilder.Tests/InsertTests.cs
@@ -305,4 +305,4 @@ public void InsertExpandoObject()
c[EngineCodes.Firebird]);
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder.Tests/MySql/MySqlLimitTests.cs b/QueryBuilder.Tests/MySql/MySqlLimitTests.cs
index 8894f4c8..659388f4 100644
--- a/QueryBuilder.Tests/MySql/MySqlLimitTests.cs
+++ b/QueryBuilder.Tests/MySql/MySqlLimitTests.cs
@@ -55,4 +55,4 @@ public void WithLimitAndOffset()
Assert.Equal(2, ctx.Bindings.Count);
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder.Tests/OperatorWhitelistTests.cs b/QueryBuilder.Tests/OperatorWhitelistTests.cs
index b56b9521..55c3aafc 100644
--- a/QueryBuilder.Tests/OperatorWhitelistTests.cs
+++ b/QueryBuilder.Tests/OperatorWhitelistTests.cs
@@ -136,4 +136,4 @@ public void ShouldNotConsiderWhereRawCondition()
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder.Tests/Oracle/OracleLegacyLimitTests.cs b/QueryBuilder.Tests/Oracle/OracleLegacyLimitTests.cs
index 500103ba..48dca81e 100644
--- a/QueryBuilder.Tests/Oracle/OracleLegacyLimitTests.cs
+++ b/QueryBuilder.Tests/Oracle/OracleLegacyLimitTests.cs
@@ -79,4 +79,4 @@ public void WithLimitAndOffset()
Assert.Equal(2, ctx.Bindings.Count);
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder.Tests/Oracle/OracleLimitTests.cs b/QueryBuilder.Tests/Oracle/OracleLimitTests.cs
index bd05a03c..13223e78 100644
--- a/QueryBuilder.Tests/Oracle/OracleLimitTests.cs
+++ b/QueryBuilder.Tests/Oracle/OracleLimitTests.cs
@@ -72,4 +72,4 @@ public void LimitAndOffset()
compiler.CompileLimit(ctx);
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder.Tests/ParameterTypeTests.cs b/QueryBuilder.Tests/ParameterTypeTests.cs
index c4f5c5d9..fd3d74fd 100644
--- a/QueryBuilder.Tests/ParameterTypeTests.cs
+++ b/QueryBuilder.Tests/ParameterTypeTests.cs
@@ -49,4 +49,4 @@ public void CorrectParameterTypeOutput(string rendered, object input)
Assert.Equal($"SELECT * FROM [Table] WHERE [Col] = {rendered}", c[EngineCodes.SqlServer]);
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder.Tests/PostgreSql/PostgreSqlLimitTests.cs b/QueryBuilder.Tests/PostgreSql/PostgreSqlLimitTests.cs
index ff6c154a..fd878c78 100644
--- a/QueryBuilder.Tests/PostgreSql/PostgreSqlLimitTests.cs
+++ b/QueryBuilder.Tests/PostgreSql/PostgreSqlLimitTests.cs
@@ -55,4 +55,4 @@ public void WithLimitAndOffset()
Assert.Equal(2, ctx.Bindings.Count);
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder.Tests/SqlServer/NestedSelectTests.cs b/QueryBuilder.Tests/SqlServer/NestedSelectTests.cs
index 8a257e8c..4c3f20a0 100644
--- a/QueryBuilder.Tests/SqlServer/NestedSelectTests.cs
+++ b/QueryBuilder.Tests/SqlServer/NestedSelectTests.cs
@@ -61,4 +61,4 @@ public void SqlCompile_QueryLimitAndNestedLimit_BindingValue()
// Assert.Contains("SELECT * FROM [Foo] WHERE [C] = 'c' AND EXISTS (SELECT TOP (1) 1 FROM [Bar]) AND [A] = 'a'", actual);
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder.Tests/SqlServer/SqlServerLegacyLimitTests.cs b/QueryBuilder.Tests/SqlServer/SqlServerLegacyLimitTests.cs
index 5ba0fc84..bb6720e1 100644
--- a/QueryBuilder.Tests/SqlServer/SqlServerLegacyLimitTests.cs
+++ b/QueryBuilder.Tests/SqlServer/SqlServerLegacyLimitTests.cs
@@ -75,4 +75,4 @@ public void ShouldKeepTheOrdersAsIsIfPaginationProvided()
Assert.DoesNotContain("(SELECT 0)", compiler.Compile(query).ToString());
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder.Tests/SqlServer/SqlServerLimitTests.cs b/QueryBuilder.Tests/SqlServer/SqlServerLimitTests.cs
index bd7827c4..aef7809a 100644
--- a/QueryBuilder.Tests/SqlServer/SqlServerLimitTests.cs
+++ b/QueryBuilder.Tests/SqlServer/SqlServerLimitTests.cs
@@ -85,4 +85,4 @@ public void ShouldKeepTheOrdersAsIsIfPaginationProvided()
Assert.DoesNotContain("(SELECT 0)", compiler.Compile(query).ToString());
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder.Tests/SqlServer/SqlServerTests.cs b/QueryBuilder.Tests/SqlServer/SqlServerTests.cs
index 5ac08e7c..3adb84f5 100644
--- a/QueryBuilder.Tests/SqlServer/SqlServerTests.cs
+++ b/QueryBuilder.Tests/SqlServer/SqlServerTests.cs
@@ -59,4 +59,4 @@ public void OffsetSqlServer_Should_Be_Incremented_By_One(int offset)
(offset + 1), c.ToString());
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder.Tests/Sqlite/SqliteLimitTests.cs b/QueryBuilder.Tests/Sqlite/SqliteLimitTests.cs
index 818c2461..d4e63503 100644
--- a/QueryBuilder.Tests/Sqlite/SqliteLimitTests.cs
+++ b/QueryBuilder.Tests/Sqlite/SqliteLimitTests.cs
@@ -55,4 +55,4 @@ public void WithLimitAndOffset()
Assert.Equal(2, ctx.Bindings.Count);
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder.Tests/UpdateTests.cs b/QueryBuilder.Tests/UpdateTests.cs
index ecc36b5b..af085d4c 100644
--- a/QueryBuilder.Tests/UpdateTests.cs
+++ b/QueryBuilder.Tests/UpdateTests.cs
@@ -316,4 +316,4 @@ public void DecrementUpdate()
Assert.Equal("UPDATE [Table] SET [Total] = [Total] - 2 WHERE [Name] = 'A'", c[EngineCodes.SqlServer]);
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/BaseQuery.cs b/QueryBuilder/BaseQuery.cs
index 9e7a9ec8..86b44a23 100644
--- a/QueryBuilder/BaseQuery.cs
+++ b/QueryBuilder/BaseQuery.cs
@@ -307,4 +307,4 @@ public Q From(Func callback, string alias = null)
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Clauses/AbstractClause.cs b/QueryBuilder/Clauses/AbstractClause.cs
index 5c00fe21..1f286594 100644
--- a/QueryBuilder/Clauses/AbstractClause.cs
+++ b/QueryBuilder/Clauses/AbstractClause.cs
@@ -19,4 +19,4 @@ public abstract class AbstractClause
public string Component { get; set; }
public abstract AbstractClause Clone();
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Clauses/AggregateClause.cs b/QueryBuilder/Clauses/AggregateClause.cs
index 802249b5..2d18d78e 100644
--- a/QueryBuilder/Clauses/AggregateClause.cs
+++ b/QueryBuilder/Clauses/AggregateClause.cs
@@ -36,4 +36,4 @@ public override AbstractClause Clone()
};
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Clauses/ColumnClause.cs b/QueryBuilder/Clauses/ColumnClause.cs
index 2d3eca36..58872d8e 100644
--- a/QueryBuilder/Clauses/ColumnClause.cs
+++ b/QueryBuilder/Clauses/ColumnClause.cs
@@ -77,4 +77,4 @@ public override AbstractClause Clone()
};
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Clauses/Combine.cs b/QueryBuilder/Clauses/Combine.cs
index 22e2cb22..da0f5e37 100644
--- a/QueryBuilder/Clauses/Combine.cs
+++ b/QueryBuilder/Clauses/Combine.cs
@@ -63,4 +63,4 @@ public override AbstractClause Clone()
};
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Clauses/ConditionClause.cs b/QueryBuilder/Clauses/ConditionClause.cs
index 845d2896..287149e5 100644
--- a/QueryBuilder/Clauses/ConditionClause.cs
+++ b/QueryBuilder/Clauses/ConditionClause.cs
@@ -336,4 +336,4 @@ public override AbstractClause Clone()
};
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Clauses/FromClause.cs b/QueryBuilder/Clauses/FromClause.cs
index 9b21a50b..a0ca9748 100644
--- a/QueryBuilder/Clauses/FromClause.cs
+++ b/QueryBuilder/Clauses/FromClause.cs
@@ -94,4 +94,4 @@ public override AbstractClause Clone()
};
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Clauses/InsertClause.cs b/QueryBuilder/Clauses/InsertClause.cs
index 41dfd74b..14ece2d2 100644
--- a/QueryBuilder/Clauses/InsertClause.cs
+++ b/QueryBuilder/Clauses/InsertClause.cs
@@ -42,4 +42,4 @@ public override AbstractClause Clone()
};
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Clauses/JoinClause.cs b/QueryBuilder/Clauses/JoinClause.cs
index 022148ee..94c6b322 100644
--- a/QueryBuilder/Clauses/JoinClause.cs
+++ b/QueryBuilder/Clauses/JoinClause.cs
@@ -47,4 +47,4 @@ public override AbstractClause Clone()
};
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Clauses/LimitClause.cs b/QueryBuilder/Clauses/LimitClause.cs
index b37d5b29..97bf542b 100644
--- a/QueryBuilder/Clauses/LimitClause.cs
+++ b/QueryBuilder/Clauses/LimitClause.cs
@@ -32,4 +32,4 @@ public override AbstractClause Clone()
};
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Clauses/OffsetClause.cs b/QueryBuilder/Clauses/OffsetClause.cs
index 39fe8b4e..2852efd1 100644
--- a/QueryBuilder/Clauses/OffsetClause.cs
+++ b/QueryBuilder/Clauses/OffsetClause.cs
@@ -32,4 +32,4 @@ public override AbstractClause Clone()
};
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Clauses/OrderClause.cs b/QueryBuilder/Clauses/OrderClause.cs
index e7e92892..69af772e 100644
--- a/QueryBuilder/Clauses/OrderClause.cs
+++ b/QueryBuilder/Clauses/OrderClause.cs
@@ -52,4 +52,4 @@ public override AbstractClause Clone()
};
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Compilers/ConditionsCompilerProvider.cs b/QueryBuilder/Compilers/ConditionsCompilerProvider.cs
index c542410a..6439da94 100644
--- a/QueryBuilder/Compilers/ConditionsCompilerProvider.cs
+++ b/QueryBuilder/Compilers/ConditionsCompilerProvider.cs
@@ -51,4 +51,4 @@ private MethodInfo FindMethodInfo(Type clauseType, string methodName)
return methodInfo;
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Compilers/MySqlCompiler.cs b/QueryBuilder/Compilers/MySqlCompiler.cs
index 1f2bae8c..f016f9f7 100644
--- a/QueryBuilder/Compilers/MySqlCompiler.cs
+++ b/QueryBuilder/Compilers/MySqlCompiler.cs
@@ -46,4 +46,4 @@ public override string CompileLimit(SqlResult ctx)
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Expressions.cs b/QueryBuilder/Expressions.cs
index f2dbbc18..8a5fdae1 100644
--- a/QueryBuilder/Expressions.cs
+++ b/QueryBuilder/Expressions.cs
@@ -25,4 +25,4 @@ public static UnsafeLiteral UnsafeLiteral(string value, bool replaceQuotes = tru
return new UnsafeLiteral(value, replaceQuotes);
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Extensions/QueryForExtensions.cs b/QueryBuilder/Extensions/QueryForExtensions.cs
index 08262624..a785a5f0 100644
--- a/QueryBuilder/Extensions/QueryForExtensions.cs
+++ b/QueryBuilder/Extensions/QueryForExtensions.cs
@@ -36,4 +36,4 @@ public static Query ForSqlServer(this Query src, Func fn)
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Helper.cs b/QueryBuilder/Helper.cs
index 23b77eb6..520d08d5 100644
--- a/QueryBuilder/Helper.cs
+++ b/QueryBuilder/Helper.cs
@@ -170,4 +170,4 @@ public static string ReplaceIdentifierUnlessEscaped(this string input, string es
return escapedRegex.Replace(nonEscapedReplace, identifier);
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Include.cs b/QueryBuilder/Include.cs
index 9e5a5a94..e0cbfe02 100644
--- a/QueryBuilder/Include.cs
+++ b/QueryBuilder/Include.cs
@@ -8,4 +8,4 @@ public class Include
public string LocalKey { get; set; }
public bool IsMany { get; set; }
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Join.cs b/QueryBuilder/Join.cs
index 9172ef08..ae0969a6 100644
--- a/QueryBuilder/Join.cs
+++ b/QueryBuilder/Join.cs
@@ -74,4 +74,4 @@ public override Join NewQuery()
return new Join();
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Properties/AssemblyInfo.cs b/QueryBuilder/Properties/AssemblyInfo.cs
index d818ff75..b8e480cf 100644
--- a/QueryBuilder/Properties/AssemblyInfo.cs
+++ b/QueryBuilder/Properties/AssemblyInfo.cs
@@ -1,3 +1,3 @@
using System.Runtime.CompilerServices;
-[assembly: InternalsVisibleTo("QueryBuilder.Tests")]
\ No newline at end of file
+[assembly: InternalsVisibleTo("QueryBuilder.Tests")]
diff --git a/QueryBuilder/Query.Aggregate.cs b/QueryBuilder/Query.Aggregate.cs
index 750f5671..d4fc5057 100644
--- a/QueryBuilder/Query.Aggregate.cs
+++ b/QueryBuilder/Query.Aggregate.cs
@@ -56,4 +56,4 @@ public Query AsMin(string column)
return AsAggregate("min", new[] { column });
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Query.Combine.cs b/QueryBuilder/Query.Combine.cs
index d28216a7..b7238264 100644
--- a/QueryBuilder/Query.Combine.cs
+++ b/QueryBuilder/Query.Combine.cs
@@ -103,4 +103,4 @@ public Query IntersectAll(Func callback)
public Query IntersectRaw(string sql, params object[] bindings) => CombineRaw(sql, bindings);
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Query.Delete.cs b/QueryBuilder/Query.Delete.cs
index f15d2940..bd00cad9 100644
--- a/QueryBuilder/Query.Delete.cs
+++ b/QueryBuilder/Query.Delete.cs
@@ -9,4 +9,4 @@ public Query AsDelete()
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Query.Having.cs b/QueryBuilder/Query.Having.cs
index 91450307..8dcf43ca 100644
--- a/QueryBuilder/Query.Having.cs
+++ b/QueryBuilder/Query.Having.cs
@@ -653,4 +653,4 @@ public Query OrHavingNotTime(string column, object value)
#endregion
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Query.Join.cs b/QueryBuilder/Query.Join.cs
index d8b4606e..3fe3bbb1 100644
--- a/QueryBuilder/Query.Join.cs
+++ b/QueryBuilder/Query.Join.cs
@@ -72,4 +72,4 @@ public Query CrossJoin(string table)
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Query.Select.cs b/QueryBuilder/Query.Select.cs
index 852b1543..ada1b029 100644
--- a/QueryBuilder/Query.Select.cs
+++ b/QueryBuilder/Query.Select.cs
@@ -63,4 +63,4 @@ public Query Select(Func callback, string alias)
return Select(callback.Invoke(NewChild()), alias);
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/SqlResult.cs b/QueryBuilder/SqlResult.cs
index 0eaaeee7..7826ea54 100644
--- a/QueryBuilder/SqlResult.cs
+++ b/QueryBuilder/SqlResult.cs
@@ -84,4 +84,4 @@ private string ChangeToSqlValue(object value)
return "'" + value.ToString() + "'";
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/UnsafeLiteral.cs b/QueryBuilder/UnsafeLiteral.cs
index 748ad0ce..b96c8080 100644
--- a/QueryBuilder/UnsafeLiteral.cs
+++ b/QueryBuilder/UnsafeLiteral.cs
@@ -20,4 +20,4 @@ public UnsafeLiteral(string value, bool replaceQuotes = true)
}
}
-}
\ No newline at end of file
+}
diff --git a/QueryBuilder/Variable.cs b/QueryBuilder/Variable.cs
index 3f899584..63b936ea 100644
--- a/QueryBuilder/Variable.cs
+++ b/QueryBuilder/Variable.cs
@@ -10,4 +10,4 @@ public Variable(string name)
}
}
-}
\ No newline at end of file
+}
diff --git a/SqlKata.Execution/InsertGetId.cs b/SqlKata.Execution/InsertGetId.cs
index a4f50094..a25d6a3f 100644
--- a/SqlKata.Execution/InsertGetId.cs
+++ b/SqlKata.Execution/InsertGetId.cs
@@ -4,4 +4,4 @@ public class InsertGetIdRow
{
public T Id { get; set; }
}
-}
\ No newline at end of file
+}
diff --git a/SqlKata.Execution/PaginationIterator.cs b/SqlKata.Execution/PaginationIterator.cs
index 4864aa08..9af8d036 100644
--- a/SqlKata.Execution/PaginationIterator.cs
+++ b/SqlKata.Execution/PaginationIterator.cs
@@ -27,4 +27,4 @@ IEnumerator IEnumerable.GetEnumerator()
return GetEnumerator();
}
}
-}
\ No newline at end of file
+}
diff --git a/SqlKata.Execution/PaginationResult.cs b/SqlKata.Execution/PaginationResult.cs
index 200ebb27..85277503 100644
--- a/SqlKata.Execution/PaginationResult.cs
+++ b/SqlKata.Execution/PaginationResult.cs
@@ -104,4 +104,4 @@ public PaginationIterator Each
}
}
-}
\ No newline at end of file
+}
diff --git a/SqlKata.Execution/Query.Extensions.cs b/SqlKata.Execution/Query.Extensions.cs
index a3aadf35..60a54ff4 100644
--- a/SqlKata.Execution/Query.Extensions.cs
+++ b/SqlKata.Execution/Query.Extensions.cs
@@ -378,4 +378,4 @@ internal static QueryFactory CreateQueryFactory(Query query)
return CreateQueryFactory(CastToXQuery(query));
}
}
-}
\ No newline at end of file
+}
diff --git a/SqlKata.Execution/QueryFactory.cs b/SqlKata.Execution/QueryFactory.cs
index cc441ae4..b10677ab 100644
--- a/SqlKata.Execution/QueryFactory.cs
+++ b/SqlKata.Execution/QueryFactory.cs
@@ -896,4 +896,4 @@ public void Dispose()
GC.SuppressFinalize(this);
}
}
-}
\ No newline at end of file
+}
From c6a55f4d093adf06fe23a169739e2069628296c9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dani=C3=ABl=20Geelen?=
Date: Wed, 5 May 2021 09:46:37 +0200
Subject: [PATCH 10/45] Trim trailing whitespace.
---
QueryBuilder/Clauses/LimitClause.cs | 2 +-
QueryBuilder/Helper.cs | 4 ++--
QueryBuilder/Query.cs | 2 +-
README.md | 2 +-
4 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/QueryBuilder/Clauses/LimitClause.cs b/QueryBuilder/Clauses/LimitClause.cs
index 97bf542b..89defc99 100644
--- a/QueryBuilder/Clauses/LimitClause.cs
+++ b/QueryBuilder/Clauses/LimitClause.cs
@@ -3,7 +3,7 @@ namespace SqlKata
public class LimitClause : AbstractClause
{
private int _limit;
-
+
public int Limit
{
get => _limit;
diff --git a/QueryBuilder/Helper.cs b/QueryBuilder/Helper.cs
index 520d08d5..ccf4bb22 100644
--- a/QueryBuilder/Helper.cs
+++ b/QueryBuilder/Helper.cs
@@ -158,13 +158,13 @@ public static IEnumerable Repeat(this string str, int count)
{
return Enumerable.Repeat(str, count);
}
-
+
public static string ReplaceIdentifierUnlessEscaped(this string input, string escapeCharacter, string identifier, string newIdentifier)
{
//Replace standard, non-escaped identifiers first
var nonEscapedRegex = new Regex($@"(? CacheDictionaryProperties = new ConcurrentDictionary();
///
diff --git a/README.md b/README.md
index 6858b787..9d5a22e3 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@
-> **WE ARE NOT ACCEPTING NEW COMPILERS, if you want to add your own compiler, we recommend to create a separate repo like SqlKata-Oracle**
+> **WE ARE NOT ACCEPTING NEW COMPILERS, if you want to add your own compiler, we recommend to create a separate repo like SqlKata-Oracle**
Follow for the latest updates about SqlKata.
From 5d7a04a7f0ad2925e53fa056befbd708e811a440 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dani=C3=ABl=20Geelen?=
Date: Wed, 9 Jun 2021 11:03:29 +0200
Subject: [PATCH 11/45] Update .editorconfig to maintain whitespace.
---
.editorconfig | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/.editorconfig b/.editorconfig
index 87f877b2..b33fe946 100755
--- a/.editorconfig
+++ b/.editorconfig
@@ -3,3 +3,26 @@ root = true
[*]
charset = utf-8
end_of_line = lf
+# Note: the trim_trailing_whitespace option is br0ken in visualstudio, it
+# simply does not follow the EditorConfig specification. Therefor you are
+# strongly encouraged to not rely on this setting alone, but please install
+# the following extension too: https://marketplace.visualstudio.com/items?itemName=MadsKristensen.TrailingWhitespaceVisualizer
+#
+# References:
+# https://developercommunity.visualstudio.com/t/EditorConfig:-trim_trailing_whitespace-d/1240174?space=8&q=trim_trailing_whitespace
+# https://developercommunity.visualstudio.com/t/editorconfig-trim_trailing_whitespace-on/134457?space=8&q=trim_trailing_whitespace
+# https://developercommunity.visualstudio.com/t/trim_trailing_whitespace-in-editorconfi/1351034?space=8&q=trim_trailing_whitespace
+# https://developercommunity.visualstudio.com/t/BUG:-editorconfig-trim_trailing_whitespa/953937?space=8&q=trim_trailing_whitespace
+trim_trailing_whitespace = true
+insert_final_newline = true
+indent_style = tab
+indent_size = 2
+
+
+[*.cs] # To match existing style
+indent_style = space
+indent_size = 4
+
+
+[*.yml]
+indent_style = space
From 29bc41c944040ab86a701be79887e66f47d9438c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dani=C3=ABl=20Geelen?=
Date: Wed, 5 May 2021 10:11:28 +0200
Subject: [PATCH 12/45] Run visual studio auto-formatter.
---
QueryBuilder.Tests/Firebird/FirebirdLimitTests.cs | 8 ++++----
.../Infrastructure/TestCompilersContainer.cs | 2 +-
QueryBuilder.Tests/InfrastructureTests.cs | 4 ++--
QueryBuilder.Tests/MySql/MySqlLimitTests.cs | 8 ++++----
QueryBuilder.Tests/PostgreSql/PostgreSqlLimitTests.cs | 8 ++++----
QueryBuilder.Tests/SqlServer/SqlServerLegacyLimitTests.cs | 8 ++++----
QueryBuilder.Tests/SqlServer/SqlServerLimitTests.cs | 8 ++++----
QueryBuilder/Helper.cs | 2 +-
QueryBuilder/Query.Insert.cs | 2 +-
QueryBuilder/UnsafeLiteral.cs | 6 +++---
10 files changed, 28 insertions(+), 28 deletions(-)
diff --git a/QueryBuilder.Tests/Firebird/FirebirdLimitTests.cs b/QueryBuilder.Tests/Firebird/FirebirdLimitTests.cs
index 5eda1d97..dd7972f2 100644
--- a/QueryBuilder.Tests/Firebird/FirebirdLimitTests.cs
+++ b/QueryBuilder.Tests/Firebird/FirebirdLimitTests.cs
@@ -17,7 +17,7 @@ public FirebirdLimitTests()
public void NoLimitNorOffset()
{
var query = new Query("Table");
- var ctx = new SqlResult {Query = query};
+ var ctx = new SqlResult { Query = query };
Assert.Null(compiler.CompileLimit(ctx));
}
@@ -26,7 +26,7 @@ public void NoLimitNorOffset()
public void LimitOnly()
{
var query = new Query("Table").Limit(10);
- var ctx = new SqlResult {Query = query};
+ var ctx = new SqlResult { Query = query };
Assert.Null(compiler.CompileLimit(ctx));
}
@@ -35,7 +35,7 @@ public void LimitOnly()
public void OffsetOnly()
{
var query = new Query("Table").Offset(20);
- var ctx = new SqlResult {Query = query};
+ var ctx = new SqlResult { Query = query };
Assert.Null(compiler.CompileLimit(ctx));
}
@@ -44,7 +44,7 @@ public void OffsetOnly()
public void LimitAndOffset()
{
var query = new Query("Table").Limit(5).Offset(20);
- var ctx = new SqlResult {Query = query};
+ var ctx = new SqlResult { Query = query };
Assert.Equal("ROWS ? TO ?", compiler.CompileLimit(ctx));
Assert.Equal(21, ctx.Bindings[0]);
diff --git a/QueryBuilder.Tests/Infrastructure/TestCompilersContainer.cs b/QueryBuilder.Tests/Infrastructure/TestCompilersContainer.cs
index 4639ee7e..c808fb6d 100644
--- a/QueryBuilder.Tests/Infrastructure/TestCompilersContainer.cs
+++ b/QueryBuilder.Tests/Infrastructure/TestCompilersContainer.cs
@@ -52,7 +52,7 @@ public Compiler Get(string engineCode)
///
public TCompiler Get(string engineCode) where TCompiler : Compiler
{
- return (TCompiler) Get(engineCode);
+ return (TCompiler)Get(engineCode);
}
///
diff --git a/QueryBuilder.Tests/InfrastructureTests.cs b/QueryBuilder.Tests/InfrastructureTests.cs
index 0cc4b085..5bb7f2df 100644
--- a/QueryBuilder.Tests/InfrastructureTests.cs
+++ b/QueryBuilder.Tests/InfrastructureTests.cs
@@ -29,11 +29,11 @@ public void CanCompile()
[Fact]
public void CanCompileSelectively()
{
- var desiredEngines = new[] {EngineCodes.SqlServer, EngineCodes.MySql};
+ var desiredEngines = new[] { EngineCodes.SqlServer, EngineCodes.MySql };
var results = Compilers.Compile(desiredEngines, new Query("Table"));
Assert.Equal(desiredEngines.Length, results.Count);
- Assert.Contains(results, a =>a.Key == EngineCodes.SqlServer);
+ Assert.Contains(results, a => a.Key == EngineCodes.SqlServer);
Assert.Contains(results, a => a.Key == EngineCodes.MySql);
}
diff --git a/QueryBuilder.Tests/MySql/MySqlLimitTests.cs b/QueryBuilder.Tests/MySql/MySqlLimitTests.cs
index 659388f4..2456b226 100644
--- a/QueryBuilder.Tests/MySql/MySqlLimitTests.cs
+++ b/QueryBuilder.Tests/MySql/MySqlLimitTests.cs
@@ -17,7 +17,7 @@ public MySqlLimitTests()
public void WithNoLimitNorOffset()
{
var query = new Query("Table");
- var ctx = new SqlResult {Query = query};
+ var ctx = new SqlResult { Query = query };
Assert.Null(compiler.CompileLimit(ctx));
}
@@ -26,7 +26,7 @@ public void WithNoLimitNorOffset()
public void WithNoOffset()
{
var query = new Query("Table").Limit(10);
- var ctx = new SqlResult {Query = query};
+ var ctx = new SqlResult { Query = query };
Assert.Equal("LIMIT ?", compiler.CompileLimit(ctx));
Assert.Equal(10, ctx.Bindings[0]);
@@ -36,7 +36,7 @@ public void WithNoOffset()
public void WithNoLimit()
{
var query = new Query("Table").Offset(20);
- var ctx = new SqlResult {Query = query};
+ var ctx = new SqlResult { Query = query };
Assert.Equal("LIMIT 18446744073709551615 OFFSET ?", compiler.CompileLimit(ctx));
Assert.Equal(20, ctx.Bindings[0]);
@@ -47,7 +47,7 @@ public void WithNoLimit()
public void WithLimitAndOffset()
{
var query = new Query("Table").Limit(5).Offset(20);
- var ctx = new SqlResult {Query = query};
+ var ctx = new SqlResult { Query = query };
Assert.Equal("LIMIT ? OFFSET ?", compiler.CompileLimit(ctx));
Assert.Equal(5, ctx.Bindings[0]);
diff --git a/QueryBuilder.Tests/PostgreSql/PostgreSqlLimitTests.cs b/QueryBuilder.Tests/PostgreSql/PostgreSqlLimitTests.cs
index fd878c78..b6342c57 100644
--- a/QueryBuilder.Tests/PostgreSql/PostgreSqlLimitTests.cs
+++ b/QueryBuilder.Tests/PostgreSql/PostgreSqlLimitTests.cs
@@ -17,7 +17,7 @@ public PostgreSqlLimitTests()
public void WithNoLimitNorOffset()
{
var query = new Query("Table");
- var ctx = new SqlResult {Query = query};
+ var ctx = new SqlResult { Query = query };
Assert.Null(compiler.CompileLimit(ctx));
}
@@ -26,7 +26,7 @@ public void WithNoLimitNorOffset()
public void WithNoOffset()
{
var query = new Query("Table").Limit(10);
- var ctx = new SqlResult {Query = query};
+ var ctx = new SqlResult { Query = query };
Assert.Equal("LIMIT ?", compiler.CompileLimit(ctx));
Assert.Equal(10, ctx.Bindings[0]);
@@ -36,7 +36,7 @@ public void WithNoOffset()
public void WithNoLimit()
{
var query = new Query("Table").Offset(20);
- var ctx = new SqlResult {Query = query};
+ var ctx = new SqlResult { Query = query };
Assert.Equal("OFFSET ?", compiler.CompileLimit(ctx));
Assert.Equal(20, ctx.Bindings[0]);
@@ -47,7 +47,7 @@ public void WithNoLimit()
public void WithLimitAndOffset()
{
var query = new Query("Table").Limit(5).Offset(20);
- var ctx = new SqlResult {Query = query};
+ var ctx = new SqlResult { Query = query };
Assert.Equal("LIMIT ? OFFSET ?", compiler.CompileLimit(ctx));
Assert.Equal(5, ctx.Bindings[0]);
diff --git a/QueryBuilder.Tests/SqlServer/SqlServerLegacyLimitTests.cs b/QueryBuilder.Tests/SqlServer/SqlServerLegacyLimitTests.cs
index bb6720e1..85493d2f 100644
--- a/QueryBuilder.Tests/SqlServer/SqlServerLegacyLimitTests.cs
+++ b/QueryBuilder.Tests/SqlServer/SqlServerLegacyLimitTests.cs
@@ -18,7 +18,7 @@ public SqlServerLegacyLimitTests()
public void NoLimitNorOffset()
{
var query = new Query("Table");
- var ctx = new SqlResult {Query = query};
+ var ctx = new SqlResult { Query = query };
Assert.Null(compiler.CompileLimit(ctx));
}
@@ -27,7 +27,7 @@ public void NoLimitNorOffset()
public void LimitOnly()
{
var query = new Query("Table").Limit(10);
- var ctx = new SqlResult {Query = query};
+ var ctx = new SqlResult { Query = query };
Assert.Null(compiler.CompileLimit(ctx));
}
@@ -36,7 +36,7 @@ public void LimitOnly()
public void OffsetOnly()
{
var query = new Query("Table").Offset(20);
- var ctx = new SqlResult {Query = query};
+ var ctx = new SqlResult { Query = query };
Assert.Null(compiler.CompileLimit(ctx));
}
@@ -45,7 +45,7 @@ public void OffsetOnly()
public void LimitAndOffset()
{
var query = new Query("Table").Limit(5).Offset(20);
- var ctx = new SqlResult {Query = query};
+ var ctx = new SqlResult { Query = query };
Assert.Null(compiler.CompileLimit(ctx));
}
diff --git a/QueryBuilder.Tests/SqlServer/SqlServerLimitTests.cs b/QueryBuilder.Tests/SqlServer/SqlServerLimitTests.cs
index aef7809a..011d8a2e 100644
--- a/QueryBuilder.Tests/SqlServer/SqlServerLimitTests.cs
+++ b/QueryBuilder.Tests/SqlServer/SqlServerLimitTests.cs
@@ -18,7 +18,7 @@ public SqlServerLimitTests()
public void NoLimitNorOffset()
{
var query = new Query("Table");
- var ctx = new SqlResult {Query = query};
+ var ctx = new SqlResult { Query = query };
Assert.Null(compiler.CompileLimit(ctx));
}
@@ -27,7 +27,7 @@ public void NoLimitNorOffset()
public void LimitOnly()
{
var query = new Query("Table").Limit(10);
- var ctx = new SqlResult {Query = query};
+ var ctx = new SqlResult { Query = query };
Assert.EndsWith("OFFSET ? ROWS FETCH NEXT ? ROWS ONLY", compiler.CompileLimit(ctx));
Assert.Equal(2, ctx.Bindings.Count);
@@ -39,7 +39,7 @@ public void LimitOnly()
public void OffsetOnly()
{
var query = new Query("Table").Offset(20);
- var ctx = new SqlResult {Query = query};
+ var ctx = new SqlResult { Query = query };
Assert.EndsWith("OFFSET ? ROWS", compiler.CompileLimit(ctx));
@@ -51,7 +51,7 @@ public void OffsetOnly()
public void LimitAndOffset()
{
var query = new Query("Table").Limit(5).Offset(20);
- var ctx = new SqlResult {Query = query};
+ var ctx = new SqlResult { Query = query };
Assert.EndsWith("OFFSET ? ROWS FETCH NEXT ? ROWS ONLY", compiler.CompileLimit(ctx));
diff --git a/QueryBuilder/Helper.cs b/QueryBuilder/Helper.cs
index ccf4bb22..998e5d59 100644
--- a/QueryBuilder/Helper.cs
+++ b/QueryBuilder/Helper.cs
@@ -10,7 +10,7 @@ public static class Helper
{
public static bool IsArray(object value)
{
- if(value is string)
+ if (value is string)
{
return false;
}
diff --git a/QueryBuilder/Query.Insert.cs b/QueryBuilder/Query.Insert.cs
index bebce921..dbec60af 100644
--- a/QueryBuilder/Query.Insert.cs
+++ b/QueryBuilder/Query.Insert.cs
@@ -51,7 +51,7 @@ public Query AsInsert(IEnumerable> values, bool ret
ClearComponent("insert").AddComponent("insert", new InsertClause
{
- Columns = values.Select(x=>x.Key).ToList(),
+ Columns = values.Select(x => x.Key).ToList(),
Values = values.Select(x => x.Value).ToList(),
ReturnId = returnId,
});
diff --git a/QueryBuilder/UnsafeLiteral.cs b/QueryBuilder/UnsafeLiteral.cs
index b96c8080..23d81e2d 100644
--- a/QueryBuilder/UnsafeLiteral.cs
+++ b/QueryBuilder/UnsafeLiteral.cs
@@ -2,16 +2,16 @@ namespace SqlKata
{
public class UnsafeLiteral
{
- public string Value {get; set;}
+ public string Value { get; set; }
public UnsafeLiteral(string value, bool replaceQuotes = true)
{
- if(value == null)
+ if (value == null)
{
value = "";
}
- if(replaceQuotes)
+ if (replaceQuotes)
{
value = value.Replace("'", "''");
}
From 96bad666b028a7cb3d44fac7a5b43d7c0757cb1d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dani=C3=ABl=20Geelen?=
Date: Tue, 4 May 2021 16:59:57 +0200
Subject: [PATCH 13/45] Make sure that tests use a predictable time zone.
---
QueryBuilder.Tests/InsertTests.cs | 14 +++++++-------
QueryBuilder.Tests/ParameterTypeTests.cs | 2 +-
QueryBuilder.Tests/UpdateTests.cs | 10 +++++-----
3 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/QueryBuilder.Tests/InsertTests.cs b/QueryBuilder.Tests/InsertTests.cs
index 10aad0e0..85af4b51 100644
--- a/QueryBuilder.Tests/InsertTests.cs
+++ b/QueryBuilder.Tests/InsertTests.cs
@@ -37,7 +37,7 @@ public void InsertObject()
new
{
Name = "The User",
- Age = new DateTime(2018, 1, 1),
+ Age = new DateTime(2018, 1, 1, 0, 0, 0, DateTimeKind.Utc),
});
var c = Compile(query);
@@ -186,7 +186,7 @@ public void InsertFromRaw()
new
{
Name = "The User",
- Age = new DateTime(2018, 1, 1),
+ Age = new DateTime(2018, 1, 1, 0, 0, 0, DateTimeKind.Utc),
});
var c = Compile(query);
@@ -205,7 +205,7 @@ public void InsertFromQueryShouldFail()
new
{
Name = "The User",
- Age = new DateTime(2018, 1, 1),
+ Age = new DateTime(2018, 1, 1, 0, 0, 0, DateTimeKind.Utc),
});
Assert.Throws(() =>
@@ -220,7 +220,7 @@ public void InsertKeyValuePairs()
var dictionaryUser = new Dictionary
{
{ "Name", "The User" },
- { "Age", new DateTime(2018, 1, 1) },
+ { "Age", new DateTime(2018, 1, 1, 0, 0, 0, DateTimeKind.Utc) },
}
.ToArray();
@@ -243,7 +243,7 @@ public void InsertDictionary()
{
var dictionaryUser = new Dictionary {
{ "Name", "The User" },
- { "Age", new DateTime(2018, 1, 1) },
+ { "Age", new DateTime(2018, 1, 1, 0, 0, 0, DateTimeKind.Utc) },
};
var query = new Query("Table")
@@ -267,7 +267,7 @@ public void InsertReadOnlyDictionary()
new Dictionary
{
{ "Name", "The User" },
- { "Age", new DateTime(2018, 1, 1) },
+ { "Age", new DateTime(2018, 1, 1, 0, 0, 0, DateTimeKind.Utc) },
});
var query = new Query("Table")
@@ -289,7 +289,7 @@ public void InsertExpandoObject()
{
dynamic expandoUser = new ExpandoObject();
expandoUser.Name = "The User";
- expandoUser.Age = new DateTime(2018, 1, 1);
+ expandoUser.Age = new DateTime(2018, 1, 1, 0, 0, 0, DateTimeKind.Utc);
var query = new Query("Table")
.AsInsert(expandoUser);
diff --git a/QueryBuilder.Tests/ParameterTypeTests.cs b/QueryBuilder.Tests/ParameterTypeTests.cs
index c4f5c5d9..ad4e3eeb 100644
--- a/QueryBuilder.Tests/ParameterTypeTests.cs
+++ b/QueryBuilder.Tests/ParameterTypeTests.cs
@@ -27,7 +27,7 @@ public class ParameterTypeGenerator : IEnumerable
new object[] {Convert.ToSingle("-2.8", CultureInfo.InvariantCulture).ToString(), -2.8},
new object[] {"true", true},
new object[] {"false", false},
- new object[] {"'2018-10-28 19:22:00'", new DateTime(2018, 10, 28, 19, 22, 0)},
+ new object[] {"'2018-10-28 19:22:00'", new DateTime(2018, 10, 28, 19, 22, 0, DateTimeKind.Utc)},
new object[] {"0 /* First */", EnumExample.First},
new object[] {"1 /* Second */", EnumExample.Second},
new object[] {"'a string'", "a string"},
diff --git a/QueryBuilder.Tests/UpdateTests.cs b/QueryBuilder.Tests/UpdateTests.cs
index 994feddc..1070ac52 100644
--- a/QueryBuilder.Tests/UpdateTests.cs
+++ b/QueryBuilder.Tests/UpdateTests.cs
@@ -61,7 +61,7 @@ public void UpdateObject()
var query = new Query("Table").AsUpdate(new
{
Name = "The User",
- Age = new DateTime(2018, 1, 1),
+ Age = new DateTime(2018, 1, 1, 0, 0, 0, DateTimeKind.Utc),
});
var c = Compile(query);
@@ -215,7 +215,7 @@ public void UpdateUsingKeyValuePairs()
var dictionaryUser = new Dictionary
{
{ "Name", "The User" },
- { "Age", new DateTime(2018, 1, 1) },
+ { "Age", new DateTime(2018, 1, 1, 0, 0, 0, DateTimeKind.Utc) },
}
.ToArray();
@@ -234,7 +234,7 @@ public void UpdateUsingDictionary()
{
var dictionaryUser = new Dictionary {
{ "Name", "The User" },
- { "Age", new DateTime(2018, 1, 1) },
+ { "Age", new DateTime(2018, 1, 1, 0, 0, 0, DateTimeKind.Utc) },
};
var query = new Query("Table")
@@ -254,7 +254,7 @@ public void UpdateUsingReadOnlyDictionary()
new Dictionary
{
{ "Name", "The User" },
- { "Age", new DateTime(2018, 1, 1) },
+ { "Age", new DateTime(2018, 1, 1, 0, 0, 0, DateTimeKind.Utc) },
});
var query = new Query("Table")
@@ -272,7 +272,7 @@ public void UpdateUsingExpandoObject()
{
dynamic expandoUser = new ExpandoObject();
expandoUser.Name = "The User";
- expandoUser.Age = new DateTime(2018, 1, 1);
+ expandoUser.Age = new DateTime(2018, 1, 1, 0, 0, 0, DateTimeKind.Utc);
var query = new Query("Table")
.AsUpdate(expandoUser);
From e5a84841f1ca858e121a3207be2b09a4c792af0a Mon Sep 17 00:00:00 2001
From: Aaron Sherber
Date: Tue, 22 Jun 2021 20:36:37 -0400
Subject: [PATCH 14/45] Add Select overload with IEnumerable
---
QueryBuilder.Tests/SelectTests.cs | 14 ++++++++++++++
QueryBuilder/Query.Select.cs | 6 ++++++
2 files changed, 20 insertions(+)
diff --git a/QueryBuilder.Tests/SelectTests.cs b/QueryBuilder.Tests/SelectTests.cs
index 1b5b3133..eef53678 100644
--- a/QueryBuilder.Tests/SelectTests.cs
+++ b/QueryBuilder.Tests/SelectTests.cs
@@ -2,6 +2,7 @@
using SqlKata.Extensions;
using SqlKata.Tests.Infrastructure;
using System;
+using System.Collections.Generic;
using Xunit;
namespace SqlKata.Tests
@@ -21,6 +22,19 @@ public void BasicSelect()
Assert.Equal("SELECT \"id\", \"name\" FROM \"users\"", c[EngineCodes.Oracle]);
}
+ [Fact]
+ public void BasicSelectEnumerable()
+ {
+ var q = new Query().From("users").Select(new List() { "id", "name" });
+ var c = Compile(q);
+
+ Assert.Equal("SELECT [id], [name] FROM [users]", c[EngineCodes.SqlServer]);
+ Assert.Equal("SELECT `id`, `name` FROM `users`", c[EngineCodes.MySql]);
+ Assert.Equal("SELECT \"id\", \"name\" FROM \"users\"", c[EngineCodes.PostgreSql]);
+ Assert.Equal("SELECT \"ID\", \"NAME\" FROM \"USERS\"", c[EngineCodes.Firebird]);
+ Assert.Equal("SELECT \"id\", \"name\" FROM \"users\"", c[EngineCodes.Oracle]);
+ }
+
[Fact]
public void BasicSelectWhereBindingIsEmptyOrNull()
{
diff --git a/QueryBuilder/Query.Select.cs b/QueryBuilder/Query.Select.cs
index 852b1543..b02d7828 100644
--- a/QueryBuilder/Query.Select.cs
+++ b/QueryBuilder/Query.Select.cs
@@ -1,4 +1,5 @@
using System;
+using System.Collections.Generic;
using System.Linq;
namespace SqlKata
@@ -7,6 +8,11 @@ public partial class Query
{
public Query Select(params string[] columns)
+ {
+ return Select(columns.AsEnumerable());
+ }
+
+ public Query Select(IEnumerable columns)
{
Method = "select";
From 2c844b62cae20d357fcac043d6dc1059c2b6bd4b Mon Sep 17 00:00:00 2001
From: Ahmad Moussawi
Date: Fri, 16 Jul 2021 19:46:01 +0300
Subject: [PATCH 15/45] Delegate where(boolean) to WhereTrue/WhereFalse methods
---
QueryBuilder.Tests/GeneralTests.cs | 56 ++++++++++++++++++++++++++++++
QueryBuilder/Base.Where.cs | 10 ++++++
2 files changed, 66 insertions(+)
diff --git a/QueryBuilder.Tests/GeneralTests.cs b/QueryBuilder.Tests/GeneralTests.cs
index 2f5f7523..7939f55b 100644
--- a/QueryBuilder.Tests/GeneralTests.cs
+++ b/QueryBuilder.Tests/GeneralTests.cs
@@ -435,5 +435,61 @@ public void UnsafeLiteral_Update()
Assert.Equal("UPDATE [Table] SET [Count] = Count + 1", c[EngineCodes.SqlServer].ToString());
}
+
+ [Fact]
+ public void Passing_Boolean_To_Where_Should_Call_WhereTrue_Or_WhereFalse()
+ {
+ var query = new Query("Table").Where("Col", true);
+
+ var engines = new[] {
+ EngineCodes.SqlServer,
+ };
+
+ var c = Compilers.Compile(engines, query);
+
+ Assert.Equal("SELECT * FROM [Table] WHERE [Col] = cast(1 as bit)", c[EngineCodes.SqlServer].ToString());
+ }
+
+ [Fact]
+ public void Passing_Boolean_False_To_Where_Should_Call_WhereTrue_Or_WhereFalse()
+ {
+ var query = new Query("Table").Where("Col", false);
+
+ var engines = new[] {
+ EngineCodes.SqlServer,
+ };
+
+ var c = Compilers.Compile(engines, query);
+
+ Assert.Equal("SELECT * FROM [Table] WHERE [Col] = cast(0 as bit)", c[EngineCodes.SqlServer].ToString());
+ }
+
+ [Fact]
+ public void Passing_Negative_Boolean_To_Where_Should_Call_WhereTrue_Or_WhereFalse()
+ {
+ var query = new Query("Table").Where("Col", "!=", true);
+
+ var engines = new[] {
+ EngineCodes.SqlServer,
+ };
+
+ var c = Compilers.Compile(engines, query);
+
+ Assert.Equal("SELECT * FROM [Table] WHERE [Col] != cast(1 as bit)", c[EngineCodes.SqlServer].ToString());
+ }
+
+ [Fact]
+ public void Passing_Negative_Boolean_False_To_Where_Should_Call_WhereTrue_Or_WhereFalse()
+ {
+ var query = new Query("Table").Where("Col", "!=", false);
+
+ var engines = new[] {
+ EngineCodes.SqlServer,
+ };
+
+ var c = Compilers.Compile(engines, query);
+
+ Assert.Equal("SELECT * FROM [Table] WHERE [Col] != cast(0 as bit)", c[EngineCodes.SqlServer].ToString());
+ }
}
}
diff --git a/QueryBuilder/Base.Where.cs b/QueryBuilder/Base.Where.cs
index 02f8f498..133a7480 100644
--- a/QueryBuilder/Base.Where.cs
+++ b/QueryBuilder/Base.Where.cs
@@ -18,6 +18,16 @@ public Q Where(string column, string op, object value)
return Not(op != "=").WhereNull(column);
}
+ if (value is bool boolValue)
+ {
+ if (op != "=")
+ {
+ Not();
+ }
+
+ return boolValue ? WhereTrue(column) : WhereFalse(column);
+ }
+
return AddComponent("where", new BasicCondition
{
Column = column,
From 809fb284ed84b732ace8662b5296094a72db58f8 Mon Sep 17 00:00:00 2001
From: Ahmad Moussawi
Date: Fri, 16 Jul 2021 19:51:09 +0300
Subject: [PATCH 16/45] fix unit tests
---
QueryBuilder.Tests/ParameterTypeTests.cs | 4 ++--
QueryBuilder.Tests/SqlServer/NestedSelectTests.cs | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/QueryBuilder.Tests/ParameterTypeTests.cs b/QueryBuilder.Tests/ParameterTypeTests.cs
index c4f5c5d9..4259415a 100644
--- a/QueryBuilder.Tests/ParameterTypeTests.cs
+++ b/QueryBuilder.Tests/ParameterTypeTests.cs
@@ -25,8 +25,8 @@ public class ParameterTypeGenerator : IEnumerable
new object[] {Convert.ToSingle("10.5", CultureInfo.InvariantCulture).ToString(), 10.5},
new object[] {"-2", -2},
new object[] {Convert.ToSingle("-2.8", CultureInfo.InvariantCulture).ToString(), -2.8},
- new object[] {"true", true},
- new object[] {"false", false},
+ new object[] {"cast(1 as bit)", true},
+ new object[] {"cast(0 as bit)", false},
new object[] {"'2018-10-28 19:22:00'", new DateTime(2018, 10, 28, 19, 22, 0)},
new object[] {"0 /* First */", EnumExample.First},
new object[] {"1 /* Second */", EnumExample.Second},
diff --git a/QueryBuilder.Tests/SqlServer/NestedSelectTests.cs b/QueryBuilder.Tests/SqlServer/NestedSelectTests.cs
index 9495751d..f6e7d3c5 100644
--- a/QueryBuilder.Tests/SqlServer/NestedSelectTests.cs
+++ b/QueryBuilder.Tests/SqlServer/NestedSelectTests.cs
@@ -56,7 +56,7 @@ public void SqlCompile_QueryLimitAndNestedLimit_BindingValue()
// var q = new Query().From("Foo").Where("C", "c").WhereExists(n).Where("A", "a");
var actual = compiler.Compile(q).ToString();
- Assert.Contains("SELECT * FROM [Foo] WHERE [x] = true AND NOT EXISTS (SELECT 1 FROM [Bar])",
+ Assert.Contains("SELECT * FROM [Foo] WHERE [x] = cast(1 as bit) AND NOT EXISTS (SELECT 1 FROM [Bar])",
actual);
// Assert.Contains("SELECT * FROM [Foo] WHERE [C] = 'c' AND EXISTS (SELECT TOP (1) 1 FROM [Bar]) AND [A] = 'a'", actual);
}
From b1f0e44d92f96919c30a1efbe33db2eeeb29f393 Mon Sep 17 00:00:00 2001
From: Christian Steinert
Date: Thu, 5 Aug 2021 21:03:01 +0200
Subject: [PATCH 17/45] Change License Tag in the *.csproj file
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
… from PackageLicenseUrl to PackageLicenseExpression to conform with current standard.
See https://docs.microsoft.com/en-us/nuget/consume-packages/finding-and-choosing-packages#license-url-deprecation
and https://docs.microsoft.com/en-us/nuget/reference/msbuild-targets#packing-a-license-expression-or-a-license-file
---
QueryBuilder/QueryBuilder.csproj | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/QueryBuilder/QueryBuilder.csproj b/QueryBuilder/QueryBuilder.csproj
index ffcce676..6335a971 100755
--- a/QueryBuilder/QueryBuilder.csproj
+++ b/QueryBuilder/QueryBuilder.csproj
@@ -14,7 +14,7 @@
sql;query-builder;dynamic-query
https://github.com/sqlkata/querybuilder
https://github.com/sqlkata/querybuilder
- https://github.com/sqlkata/querybuilder/licence
+ MIT
true
git
https://github.com/sqlkata/querybuilder
@@ -27,4 +27,4 @@
-
\ No newline at end of file
+
From 6abcaaf8f665e06a8e27e4bf5fc02a614fa761d9 Mon Sep 17 00:00:00 2001
From: wayne byard
Date: Sun, 8 Aug 2021 16:10:21 -0400
Subject: [PATCH 18/45] When using .Include against a nullable FK, mapping to
the dynamic result causes an exception. Added a guard to ensure dynamic
mapping no longer fails when running across a FK that is null.
---
SqlKata.Execution/QueryFactory.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/SqlKata.Execution/QueryFactory.cs b/SqlKata.Execution/QueryFactory.cs
index b10677ab..8430e848 100644
--- a/SqlKata.Execution/QueryFactory.cs
+++ b/SqlKata.Execution/QueryFactory.cs
@@ -749,8 +749,8 @@ private static IEnumerable handleIncludes(Query query, IEnumerable resu
foreach (var item in dynamicResult)
{
- var foreignValue = item[include.ForeignKey].ToString();
- item[include.Name] = related.ContainsKey(foreignValue) ? related[foreignValue] : null;
+ var foreignValue = item[include.ForeignKey]?.ToString();
+ item[include.Name] = foreignValue != null && related.ContainsKey(foreignValue) ? related[foreignValue] : null;
}
}
From 97ce5da484bea17aa15bfe02c66e29d90873cfc7 Mon Sep 17 00:00:00 2001
From: wayne byard
Date: Sun, 8 Aug 2021 16:10:21 -0400
Subject: [PATCH 19/45] When using .Include against a nullable FK, mapping to
the dynamic result causes an exception. Added a guard to ensure dynamic
mapping no longer fails when running across a FK that is null.
---
SqlKata.Execution/QueryFactory.cs | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/SqlKata.Execution/QueryFactory.cs b/SqlKata.Execution/QueryFactory.cs
index b10677ab..5ff399aa 100644
--- a/SqlKata.Execution/QueryFactory.cs
+++ b/SqlKata.Execution/QueryFactory.cs
@@ -749,8 +749,8 @@ private static IEnumerable handleIncludes(Query query, IEnumerable resu
foreach (var item in dynamicResult)
{
- var foreignValue = item[include.ForeignKey].ToString();
- item[include.Name] = related.ContainsKey(foreignValue) ? related[foreignValue] : null;
+ var foreignValue = item[include.ForeignKey]?.ToString();
+ item[include.Name] = foreignValue != null && related.ContainsKey(foreignValue) ? related[foreignValue] : null;
}
}
@@ -843,8 +843,8 @@ private static async Task> handleIncludesAsync(Query query, IE
foreach (var item in dynamicResult)
{
- var foreignValue = item[include.ForeignKey].ToString();
- item[include.Name] = related.ContainsKey(foreignValue) ? related[foreignValue] : null;
+ var foreignValue = item[include.ForeignKey]?.ToString();
+ item[include.Name] = foreignValue != null && related.ContainsKey(foreignValue) ? related[foreignValue] : null;
}
}
From 24826597fc11b8a72ea47ae8a9df92090987bc04 Mon Sep 17 00:00:00 2001
From: mnsrulz
Date: Fri, 19 Nov 2021 23:40:04 -0500
Subject: [PATCH 20/45] allow select without table to support cross apply
---
QueryBuilder.Tests/SelectTests.cs | 35 ++++++++++++++++++++++++++
QueryBuilder/Compilers/Compiler.cs | 10 ++++----
QueryBuilder/Query.Join.cs | 40 ++++++++++++++++++++++++++++++
3 files changed, 80 insertions(+), 5 deletions(-)
diff --git a/QueryBuilder.Tests/SelectTests.cs b/QueryBuilder.Tests/SelectTests.cs
index 8341bf1f..29f77b31 100644
--- a/QueryBuilder.Tests/SelectTests.cs
+++ b/QueryBuilder.Tests/SelectTests.cs
@@ -803,5 +803,40 @@ public void EscapeClauseThrowsForMultipleCharacters()
.HavingContains("Column1", @"TestString\%", false, @"\aa");
});
}
+
+
+ [Fact]
+ public void BasicSelectRaw_WithNoTable()
+ {
+ var q = new Query().SelectRaw("somefunction() as c1");
+
+ var c = Compilers.CompileFor(EngineCodes.SqlServer, q);
+ Assert.Equal("SELECT somefunction() as c1", c.ToString());
+ }
+
+ [Fact]
+ public void BasicSelect_WithNoTable()
+ {
+ var q = new Query().Select("c1");
+ var c = Compilers.CompileFor(EngineCodes.SqlServer, q);
+ Assert.Equal("SELECT [c1]", c.ToString());
+ }
+
+ [Fact]
+ public void CrossApply_Column_Reusability()
+ {
+ var q = new Query("users").Select("name", "salary", "taxbracket", "taxamount", "grosspay")
+ .CrossApply(new Query().SelectRaw("case when salary < 5000 then 10 when salary < 10000 then 20 else 30 end as taxbracket").As("t1"), j => j)
+ .CrossApply(new Query().SelectRaw("salary * taxbracket as taxamount").As("t2"), j => j)
+ .CrossApply(new Query().SelectRaw("salary - taxamount as grosspay").As("t3"), j => j);
+ var c = Compilers.CompileFor(EngineCodes.SqlServer, q);
+
+ Assert.Equal(string.Join("\n", new[] {
+ "SELECT [name], [salary], [taxbracket], [taxamount], [grosspay] FROM [users] ",
+ "CROSS APPLY (SELECT case when salary < 5000 then 10 when salary < 10000 then 20 else 30 end as taxbracket) AS [t1]",
+ "CROSS APPLY (SELECT salary * taxbracket as taxamount) AS [t2]",
+ "CROSS APPLY (SELECT salary - taxamount as grosspay) AS [t3]",
+ }), c.ToString());
+ }
}
}
diff --git a/QueryBuilder/Compilers/Compiler.cs b/QueryBuilder/Compilers/Compiler.cs
index a71b0743..df1fe405 100644
--- a/QueryBuilder/Compilers/Compiler.cs
+++ b/QueryBuilder/Compilers/Compiler.cs
@@ -647,14 +647,14 @@ public virtual string CompileTableExpression(SqlResult ctx, AbstractFrom from)
public virtual string CompileFrom(SqlResult ctx)
{
- if (!ctx.Query.HasComponent("from", EngineCode))
+ if (ctx.Query.HasComponent("from", EngineCode))
{
- throw new InvalidOperationException("No table is set");
- }
+ var from = ctx.Query.GetOneComponent("from", EngineCode);
- var from = ctx.Query.GetOneComponent("from", EngineCode);
+ return "FROM " + CompileTableExpression(ctx, from);
+ }
- return "FROM " + CompileTableExpression(ctx, from);
+ return string.Empty;
}
public virtual string CompileJoins(SqlResult ctx)
diff --git a/QueryBuilder/Query.Join.cs b/QueryBuilder/Query.Join.cs
index 3fe3bbb1..d80b5df9 100644
--- a/QueryBuilder/Query.Join.cs
+++ b/QueryBuilder/Query.Join.cs
@@ -71,5 +71,45 @@ public Query CrossJoin(string table)
return Join(j => j.JoinWith(table).AsCross());
}
+ public Query CrossApply(string table, string first, string second, string op = "=")
+ {
+ return Join(table, first, second, op, "cross apply");
+ }
+
+ public Query CrossApply(string table, Func callback)
+ {
+ return Join(table, callback, "cross apply");
+ }
+
+ public Query CrossApply(Query query, Func onCallback)
+ {
+ return Join(query, onCallback, "cross apply");
+ }
+
+ public Query CrossApply(Query query)
+ {
+ return Join(query, j => j, "cross apply");
+ }
+
+ public Query OuterApply(string table, string first, string second, string op = "=")
+ {
+ return Join(table, first, second, op, "outer apply");
+ }
+
+ public Query OuterApply(string table, Func callback)
+ {
+ return Join(table, callback, "outer apply");
+ }
+
+ public Query OuterApply(Query query, Func onCallback)
+ {
+ return Join(query, onCallback, "outer apply");
+ }
+
+ public Query OuterApply(Query query)
+ {
+ return Join(query, j => j, "outer apply");
+ }
+
}
}
From 9f636625c18676242112d685a86994d64ecbe43f Mon Sep 17 00:00:00 2001
From: Ahmad Moussawi
Date: Fri, 10 Dec 2021 14:55:58 +0200
Subject: [PATCH 21/45] use ilike for case insensitive search in PostgreSql
---
QueryBuilder.Tests/SelectTests.cs | 11 +++++
QueryBuilder/Compilers/PostgresCompiler.cs | 57 ++++++++++++++++++++++
2 files changed, 68 insertions(+)
diff --git a/QueryBuilder.Tests/SelectTests.cs b/QueryBuilder.Tests/SelectTests.cs
index 1b5b3133..e52734f7 100644
--- a/QueryBuilder.Tests/SelectTests.cs
+++ b/QueryBuilder.Tests/SelectTests.cs
@@ -700,6 +700,17 @@ public void MultipleOrHaving()
Assert.Equal("SELECT * FROM [Table1] HAVING [Column1] > 1 OR [Column2] = 1", c[EngineCodes.SqlServer]);
}
+ [Fact]
+ public void ShouldUseILikeOnPostgresWhenNonCaseSensitive()
+ {
+ var q = new Query("Table1")
+ .WhereLike("Column1", "%Upper Word%", false);
+ var c = Compile(q);
+
+ Assert.Equal(@"SELECT * FROM [Table1] WHERE LOWER([Column1]) like '%upper word%'", c[EngineCodes.SqlServer]);
+ Assert.Equal("SELECT * FROM \"Table1\" WHERE \"Column1\" ilike '%Upper Word%'", c[EngineCodes.PostgreSql]);
+ }
+
[Fact]
public void EscapedWhereLike()
{
diff --git a/QueryBuilder/Compilers/PostgresCompiler.cs b/QueryBuilder/Compilers/PostgresCompiler.cs
index ea04e9d0..1d52c7f5 100644
--- a/QueryBuilder/Compilers/PostgresCompiler.cs
+++ b/QueryBuilder/Compilers/PostgresCompiler.cs
@@ -1,3 +1,6 @@
+using System;
+using System.Linq;
+
namespace SqlKata.Compilers
{
public class PostgresCompiler : Compiler
@@ -9,6 +12,60 @@ public PostgresCompiler()
public override string EngineCode { get; } = EngineCodes.PostgreSql;
+
+ protected override string CompileBasicStringCondition(SqlResult ctx, BasicStringCondition x)
+ {
+
+ var column = Wrap(x.Column);
+
+ var value = Resolve(ctx, x.Value) as string;
+
+ if (value == null)
+ {
+ throw new ArgumentException("Expecting a non nullable string");
+ }
+
+ var method = x.Operator;
+
+ if (new[] { "starts", "ends", "contains", "like", "ilike" }.Contains(x.Operator))
+ {
+ method = x.CaseSensitive ? "LIKE" : "ILIKE";
+
+ switch (x.Operator)
+ {
+ case "starts":
+ value = $"{value}%";
+ break;
+ case "ends":
+ value = $"%{value}";
+ break;
+ case "contains":
+ value = $"%{value}%";
+ break;
+ }
+ }
+
+ string sql;
+
+ if (x.Value is UnsafeLiteral)
+ {
+ sql = $"{column} {checkOperator(method)} {value}";
+ }
+ else
+ {
+ sql = $"{column} {checkOperator(method)} {Parameter(ctx, value)}";
+ }
+
+ if (!string.IsNullOrEmpty(x.EscapeCharacter))
+ {
+ sql = $"{sql} ESCAPE '{x.EscapeCharacter}'";
+ }
+
+ return x.IsNot ? $"NOT ({sql})" : sql;
+
+ }
+
+
protected override string CompileBasicDateCondition(SqlResult ctx, BasicDateCondition condition)
{
var column = Wrap(condition.Column);
From 2a1783ed8c0df8d40c0cca6f166da3c82fcec606 Mon Sep 17 00:00:00 2001
From: Alex
Date: Sat, 11 Dec 2021 15:44:14 +0100
Subject: [PATCH 22/45] Update SqlServerCompiler.cs
---
QueryBuilder/Compilers/SqlServerCompiler.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/QueryBuilder/Compilers/SqlServerCompiler.cs b/QueryBuilder/Compilers/SqlServerCompiler.cs
index 60320791..f9aee65e 100644
--- a/QueryBuilder/Compilers/SqlServerCompiler.cs
+++ b/QueryBuilder/Compilers/SqlServerCompiler.cs
@@ -12,7 +12,7 @@ public SqlServerCompiler()
}
public override string EngineCode { get; } = EngineCodes.SqlServer;
- public bool UseLegacyPagination { get; set; } = true;
+ public bool UseLegacyPagination { get; set; } = false;
protected override SqlResult CompileSelectQuery(Query query)
{
From 5fa2c83b8b7eb741d4102126b48e295f5672b023 Mon Sep 17 00:00:00 2001
From: Ahmad Moussawi
Date: Thu, 3 Feb 2022 22:45:19 +0200
Subject: [PATCH 23/45] fix Query Timeout is overriden
https://github.com/sqlkata/querybuilder/issues/345
---
QueryBuilder.Tests/ExecutionTests.cs | 9 +++++++++
SqlKata.Execution/Properties/AssemblyInfo.cs | 3 +++
SqlKata.Execution/Query.Extensions.cs | 2 +-
3 files changed, 13 insertions(+), 1 deletion(-)
create mode 100644 SqlKata.Execution/Properties/AssemblyInfo.cs
diff --git a/QueryBuilder.Tests/ExecutionTests.cs b/QueryBuilder.Tests/ExecutionTests.cs
index f67c4a57..5ed11bf0 100644
--- a/QueryBuilder.Tests/ExecutionTests.cs
+++ b/QueryBuilder.Tests/ExecutionTests.cs
@@ -14,5 +14,14 @@ public void ShouldThrowException()
new Query("Books").Get();
});
}
+
+ [Fact]
+ public void TimeoutShouldBeCarriedToNewCreatedFactory()
+ {
+ var db = new QueryFactory();
+ db.QueryTimeout = 4000;
+ var newFactory = QueryExtensions.CreateQueryFactory(db.Query());
+ Assert.Equal(db.QueryTimeout, newFactory.QueryTimeout);
+ }
}
}
\ No newline at end of file
diff --git a/SqlKata.Execution/Properties/AssemblyInfo.cs b/SqlKata.Execution/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..5e161ab1
--- /dev/null
+++ b/SqlKata.Execution/Properties/AssemblyInfo.cs
@@ -0,0 +1,3 @@
+using System.Runtime.CompilerServices;
+
+[assembly: InternalsVisibleTo("QueryBuilder.Tests")]
\ No newline at end of file
diff --git a/SqlKata.Execution/Query.Extensions.cs b/SqlKata.Execution/Query.Extensions.cs
index a3aadf35..05a3584e 100644
--- a/SqlKata.Execution/Query.Extensions.cs
+++ b/SqlKata.Execution/Query.Extensions.cs
@@ -366,7 +366,7 @@ internal static XQuery CastToXQuery(Query query, string method = null)
internal static QueryFactory CreateQueryFactory(XQuery xQuery)
{
- var factory = new QueryFactory(xQuery.Connection, xQuery.Compiler);
+ var factory = new QueryFactory(xQuery.Connection, xQuery.Compiler, xQuery.QueryFactory.QueryTimeout);
factory.Logger = xQuery.Logger;
From 922a4b8c7e773ca8e0d2c01c21d0c5554add5732 Mon Sep 17 00:00:00 2001
From: Ahmad Moussawi
Date: Fri, 4 Feb 2022 06:29:36 +0200
Subject: [PATCH 24/45] use Legacy Pagination for Unit Test
---
QueryBuilder.Tests/Infrastructure/TestCompilersContainer.cs | 3 +++
1 file changed, 3 insertions(+)
diff --git a/QueryBuilder.Tests/Infrastructure/TestCompilersContainer.cs b/QueryBuilder.Tests/Infrastructure/TestCompilersContainer.cs
index c808fb6d..2312a192 100644
--- a/QueryBuilder.Tests/Infrastructure/TestCompilersContainer.cs
+++ b/QueryBuilder.Tests/Infrastructure/TestCompilersContainer.cs
@@ -21,6 +21,9 @@ private static class Messages
[EngineCodes.PostgreSql] = new PostgresCompiler(),
[EngineCodes.Sqlite] = new SqliteCompiler(),
[EngineCodes.SqlServer] = new SqlServerCompiler()
+ {
+ UseLegacyPagination = true
+ }
};
public IEnumerable KnownEngineCodes
From 77de282fe1bf2638627d607daf961bf0580d9de7 Mon Sep 17 00:00:00 2001
From: tskong
Date: Wed, 9 Feb 2022 10:22:15 +0000
Subject: [PATCH 25/45] Escape single quotes for sql injection
---
QueryBuilder/SqlResult.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/QueryBuilder/SqlResult.cs b/QueryBuilder/SqlResult.cs
index 7826ea54..58a7b722 100644
--- a/QueryBuilder/SqlResult.cs
+++ b/QueryBuilder/SqlResult.cs
@@ -81,7 +81,7 @@ private string ChangeToSqlValue(object value)
}
// fallback to string
- return "'" + value.ToString() + "'";
+ return "'" + value.ToString().Replace("'","''") + "'";
}
}
}
From 666e112b8c4880df8e9b44d2821525666b96e97a Mon Sep 17 00:00:00 2001
From: mnsrulz
Date: Sat, 26 Feb 2022 15:43:13 +0000
Subject: [PATCH 26/45] removed cross apply unit test
---
QueryBuilder.Tests/SelectTests.cs | 18 +-------------
QueryBuilder/Query.Join.cs | 40 -------------------------------
2 files changed, 1 insertion(+), 57 deletions(-)
diff --git a/QueryBuilder.Tests/SelectTests.cs b/QueryBuilder.Tests/SelectTests.cs
index d9f61f71..a08c20c2 100644
--- a/QueryBuilder.Tests/SelectTests.cs
+++ b/QueryBuilder.Tests/SelectTests.cs
@@ -832,22 +832,6 @@ public void BasicSelect_WithNoTable()
var c = Compilers.CompileFor(EngineCodes.SqlServer, q);
Assert.Equal("SELECT [c1]", c.ToString());
}
-
- [Fact]
- public void CrossApply_Column_Reusability()
- {
- var q = new Query("users").Select("name", "salary", "taxbracket", "taxamount", "grosspay")
- .CrossApply(new Query().SelectRaw("case when salary < 5000 then 10 when salary < 10000 then 20 else 30 end as taxbracket").As("t1"), j => j)
- .CrossApply(new Query().SelectRaw("salary * taxbracket as taxamount").As("t2"), j => j)
- .CrossApply(new Query().SelectRaw("salary - taxamount as grosspay").As("t3"), j => j);
- var c = Compilers.CompileFor(EngineCodes.SqlServer, q);
-
- Assert.Equal(string.Join("\n", new[] {
- "SELECT [name], [salary], [taxbracket], [taxamount], [grosspay] FROM [users] ",
- "CROSS APPLY (SELECT case when salary < 5000 then 10 when salary < 10000 then 20 else 30 end as taxbracket) AS [t1]",
- "CROSS APPLY (SELECT salary * taxbracket as taxamount) AS [t2]",
- "CROSS APPLY (SELECT salary - taxamount as grosspay) AS [t3]",
- }), c.ToString());
- }
+
}
}
diff --git a/QueryBuilder/Query.Join.cs b/QueryBuilder/Query.Join.cs
index d80b5df9..3fe3bbb1 100644
--- a/QueryBuilder/Query.Join.cs
+++ b/QueryBuilder/Query.Join.cs
@@ -71,45 +71,5 @@ public Query CrossJoin(string table)
return Join(j => j.JoinWith(table).AsCross());
}
- public Query CrossApply(string table, string first, string second, string op = "=")
- {
- return Join(table, first, second, op, "cross apply");
- }
-
- public Query CrossApply(string table, Func callback)
- {
- return Join(table, callback, "cross apply");
- }
-
- public Query CrossApply(Query query, Func onCallback)
- {
- return Join(query, onCallback, "cross apply");
- }
-
- public Query CrossApply(Query query)
- {
- return Join(query, j => j, "cross apply");
- }
-
- public Query OuterApply(string table, string first, string second, string op = "=")
- {
- return Join(table, first, second, op, "outer apply");
- }
-
- public Query OuterApply(string table, Func callback)
- {
- return Join(table, callback, "outer apply");
- }
-
- public Query OuterApply(Query query, Func onCallback)
- {
- return Join(query, onCallback, "outer apply");
- }
-
- public Query OuterApply(Query query)
- {
- return Join(query, j => j, "outer apply");
- }
-
}
}
From 4dd08ebf299b494922d65d347abdf3d442caea7c Mon Sep 17 00:00:00 2001
From: mnsrulz
Date: Sun, 6 Mar 2022 17:34:01 +0000
Subject: [PATCH 27/45] compile where clause when no table is present
---
QueryBuilder.Tests/SelectTests.cs | 16 ++++++++++++++++
QueryBuilder/Compilers/Compiler.cs | 2 +-
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/QueryBuilder.Tests/SelectTests.cs b/QueryBuilder.Tests/SelectTests.cs
index a08c20c2..4f96569a 100644
--- a/QueryBuilder.Tests/SelectTests.cs
+++ b/QueryBuilder.Tests/SelectTests.cs
@@ -832,6 +832,22 @@ public void BasicSelect_WithNoTable()
var c = Compilers.CompileFor(EngineCodes.SqlServer, q);
Assert.Equal("SELECT [c1]", c.ToString());
}
+
+ [Fact]
+ public void BasicSelect_WithNoTableAndWhereClause()
+ {
+ var q = new Query().Select("c1").Where("p", 1);
+ var c = Compilers.CompileFor(EngineCodes.SqlServer, q);
+ Assert.Equal("SELECT [c1] WHERE [p] = 1", c.ToString());
+ }
+
+ [Fact]
+ public void BasicSelect_WithNoTableWhereRawClause()
+ {
+ var q = new Query().Select("c1").WhereRaw("1 = 1");
+ var c = Compilers.CompileFor(EngineCodes.SqlServer, q);
+ Assert.Equal("SELECT [c1] WHERE 1 = 1", c.ToString());
+ }
}
}
diff --git a/QueryBuilder/Compilers/Compiler.cs b/QueryBuilder/Compilers/Compiler.cs
index df1fe405..98d26fd8 100644
--- a/QueryBuilder/Compilers/Compiler.cs
+++ b/QueryBuilder/Compilers/Compiler.cs
@@ -687,7 +687,7 @@ public virtual string CompileJoin(SqlResult ctx, Join join, bool isNested = fals
public virtual string CompileWheres(SqlResult ctx)
{
- if (!ctx.Query.HasComponent("from", EngineCode) || !ctx.Query.HasComponent("where", EngineCode))
+ if (!ctx.Query.HasComponent("where", EngineCode))
{
return null;
}
From 56cba7e424c950c7bd8c850f2b7de79c9e2a4e3f Mon Sep 17 00:00:00 2001
From: Matt Brailsford
Date: Sat, 2 Apr 2022 14:25:08 +0100
Subject: [PATCH 28/45] De-gender comments
No need for comments to assume male developer gender
---
QueryBuilder/Base.Where.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/QueryBuilder/Base.Where.cs b/QueryBuilder/Base.Where.cs
index 133a7480..ffa7369f 100644
--- a/QueryBuilder/Base.Where.cs
+++ b/QueryBuilder/Base.Where.cs
@@ -381,7 +381,7 @@ public Q OrWhereNotBetween(string column, T lower, T higher)
public Q WhereIn(string column, IEnumerable values)
{
- // If the developer has passed a string most probably he wants List
+ // If the developer has passed a string they most likely want a List
// since string is considered as List
if (values is string)
{
From 1bf08503c02f721f583e59c73138cb26d69c6f65 Mon Sep 17 00:00:00 2001
From: Matt Brailsford
Date: Sat, 2 Apr 2022 14:26:41 +0100
Subject: [PATCH 29/45] Update Query.Having.cs
---
QueryBuilder/Query.Having.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/QueryBuilder/Query.Having.cs b/QueryBuilder/Query.Having.cs
index 8dcf43ca..ee367941 100644
--- a/QueryBuilder/Query.Having.cs
+++ b/QueryBuilder/Query.Having.cs
@@ -360,7 +360,7 @@ public Query OrHavingNotBetween(string column, T lower, T higher)
public Query HavingIn(string column, IEnumerable values)
{
- // If the developer has passed a string most probably he wants List
+ // If the developer has passed a string they most likely want a List
// since string is considered as List
if (values is string)
{
From 5e09224b40df748e4b113cbfa52df1c93715e7e3 Mon Sep 17 00:00:00 2001
From: RFBomb
Date: Wed, 6 Jul 2022 09:50:02 -0400
Subject: [PATCH 30/45] Update QueryBuilder.csproj
---
QueryBuilder/QueryBuilder.csproj | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/QueryBuilder/QueryBuilder.csproj b/QueryBuilder/QueryBuilder.csproj
index 6335a971..9ac7b106 100755
--- a/QueryBuilder/QueryBuilder.csproj
+++ b/QueryBuilder/QueryBuilder.csproj
@@ -24,6 +24,12 @@
true
+
+ bin\Debug\netstandard2.0\SqlKata.xml
+
+
+ bin\Release\netstandard2.0\SqlKata.xml
+
From 8e2052cf9e88ce966cec20262fe931bb8f4a336a Mon Sep 17 00:00:00 2001
From: RFBomb
Date: Wed, 6 Jul 2022 09:52:45 -0400
Subject: [PATCH 31/45] Update SqlKata.Execution.csproj
---
SqlKata.Execution/SqlKata.Execution.csproj | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/SqlKata.Execution/SqlKata.Execution.csproj b/SqlKata.Execution/SqlKata.Execution.csproj
index 41c3dba2..9d66f194 100644
--- a/SqlKata.Execution/SqlKata.Execution.csproj
+++ b/SqlKata.Execution/SqlKata.Execution.csproj
@@ -22,6 +22,12 @@
true
+
+
+ bin\Release\netstandard2.0\SqlKata.Execution.xml
+
+
+ bin\Debug\netstandard2.0\SqlKata.Execution.xml
From 1ccf342687d8924bbe11ba2122017b1372b52ff6 Mon Sep 17 00:00:00 2001
From: "allcontributors[bot]"
<46447321+allcontributors[bot]@users.noreply.github.com>
Date: Sun, 24 Jul 2022 08:02:53 +0000
Subject: [PATCH 32/45] docs: update README.md [skip ci]
---
README.md | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/README.md b/README.md
index 9d5a22e3..1021df5a 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,7 @@
+
+[](#contributors-)
+
SqlKata Query Builder
@@ -162,3 +165,23 @@ int affected = db.Query("Users").Where("Id", 1).Update(new {
```cs
int affected = db.Query("Users").Where("Id", 1).Delete();
```
+
+## Contributors ✨
+
+Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
+
+
+
+
+
+
+
+
+
+
+
+This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
\ No newline at end of file
From 2a3b55302ba8df894dfb61a3971851346dbb4c1a Mon Sep 17 00:00:00 2001
From: "allcontributors[bot]"
<46447321+allcontributors[bot]@users.noreply.github.com>
Date: Sun, 24 Jul 2022 08:02:54 +0000
Subject: [PATCH 33/45] docs: create .all-contributorsrc [skip ci]
---
.all-contributorsrc | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
create mode 100644 .all-contributorsrc
diff --git a/.all-contributorsrc b/.all-contributorsrc
new file mode 100644
index 00000000..9ff06168
--- /dev/null
+++ b/.all-contributorsrc
@@ -0,0 +1,24 @@
+{
+ "files": [
+ "README.md"
+ ],
+ "imageSize": 100,
+ "commit": false,
+ "contributors": [
+ {
+ "login": "mnsrulz",
+ "name": "mnsrulz",
+ "avatar_url": "https://avatars.githubusercontent.com/u/1809086?v=4",
+ "profile": "https://github.com/mnsrulz",
+ "contributions": [
+ "code"
+ ]
+ }
+ ],
+ "contributorsPerLine": 7,
+ "projectName": "querybuilder",
+ "projectOwner": "sqlkata",
+ "repoType": "github",
+ "repoHost": "https://github.com",
+ "skipCi": true
+}
From e0430a3b299b8c02ecdb95112cd46e148c8bdb0d Mon Sep 17 00:00:00 2001
From: Ahmad Moussawi
Date: Sun, 24 Jul 2022 11:07:27 +0300
Subject: [PATCH 34/45] Update README.md
Fix all contributors badge position
---
README.md | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/README.md b/README.md
index 1021df5a..ef0ea96e 100644
--- a/README.md
+++ b/README.md
@@ -1,20 +1,21 @@
-
-[](#contributors-)
-
SqlKata Query Builder
-
-
+
+
+
+
+
+
> **WE ARE NOT ACCEPTING NEW COMPILERS, if you want to add your own compiler, we recommend to create a separate repo like SqlKata-Oracle**
Follow for the latest updates about SqlKata.
@@ -184,4 +185,4 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
-This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
\ No newline at end of file
+This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
From fe781b5b4968680e64522294719883905931ecf4 Mon Sep 17 00:00:00 2001
From: Ahmad Moussawi
Date: Mon, 8 Aug 2022 17:21:09 +0300
Subject: [PATCH 35/45] Add support for MySQL test
---
QueryBuilder.Tests/MySqlExecutionTest.cs | 73 ++++++++++++++++++++
QueryBuilder.Tests/QueryBuilder.Tests.csproj | 3 +-
2 files changed, 75 insertions(+), 1 deletion(-)
create mode 100644 QueryBuilder.Tests/MySqlExecutionTest.cs
diff --git a/QueryBuilder.Tests/MySqlExecutionTest.cs b/QueryBuilder.Tests/MySqlExecutionTest.cs
new file mode 100644
index 00000000..184612b3
--- /dev/null
+++ b/QueryBuilder.Tests/MySqlExecutionTest.cs
@@ -0,0 +1,73 @@
+using SqlKata.Compilers;
+using Xunit;
+using SqlKata.Execution;
+using MySql.Data.MySqlClient;
+using System;
+using System.Linq;
+
+namespace SqlKata.Tests
+{
+ public class MySqlExecutionTest
+ {
+ [Fact]
+ public void EmptySelect()
+ {
+
+ var db = SetupDb();
+ var sql = @"
+ CREATE TABLE Cars(
+ Id INT PRIMARY KEY AUTO_INCREMENT,
+ Brand TEXT NOT NULL,
+ Year INT NOT NULL,
+ Color TEXT NULL
+ )
+ ";
+ db.Statement(sql);
+
+ var rows = db.Query("Cars").Get();
+
+ Assert.Empty(rows);
+
+ db.Statement("DROP TABLE IF EXISTS `Cars`");
+ }
+
+ [Fact]
+ public void SelectWithLimit()
+ {
+
+ var db = SetupDb();
+ var sql = @"
+ CREATE TABLE Cars(
+ Id INT PRIMARY KEY AUTO_INCREMENT,
+ Brand TEXT NOT NULL,
+ Year INT NOT NULL,
+ Color TEXT NULL
+ )
+ ";
+ db.Statement(sql);
+
+ db.Statement("INSERT INTO `Cars`(Brand, Year) VALUES ('Honda', 2020)");
+
+ var rows = db.Query("Cars").Get().ToList();
+
+ Assert.Equal(rows.Count(), 1);
+
+ db.Statement("DROP TABLE IF EXISTS `Cars`");
+ }
+
+ public QueryFactory SetupDb()
+ {
+ var host = System.Environment.GetEnvironmentVariable("MYSQL_HOST");
+ var user = System.Environment.GetEnvironmentVariable("MYSQL_USER");
+ var dbName = System.Environment.GetEnvironmentVariable("MYSQL_DB");
+
+ var connection = new MySqlConnection($"server={host};user={user};database={dbName}");
+
+ var db = new QueryFactory(connection, new MySqlCompiler());
+
+ db.Statement("DROP TABLE IF EXISTS `Cars`");
+
+ return db;
+ }
+ }
+}
\ No newline at end of file
diff --git a/QueryBuilder.Tests/QueryBuilder.Tests.csproj b/QueryBuilder.Tests/QueryBuilder.Tests.csproj
index 775844ea..05c5e175 100755
--- a/QueryBuilder.Tests/QueryBuilder.Tests.csproj
+++ b/QueryBuilder.Tests/QueryBuilder.Tests.csproj
@@ -1,12 +1,13 @@
- net5.0
+ net6.0
Library
false
SqlKata.Tests
+
From b7e0159e75b14182a40749dfe43b2752687e48f1 Mon Sep 17 00:00:00 2001
From: Ahmad Moussawi
Date: Mon, 8 Aug 2022 17:27:20 +0300
Subject: [PATCH 36/45] Update build.yml
---
.github/workflows/build.yml | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 485e7079..3f3dd3f8 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -27,6 +27,15 @@ jobs:
strategy:
matrix:
os: [ ubuntu-latest ]
+ services:
+ mysql:
+ image: mysql:5.7
+ env:
+ MYSQL_ALLOW_EMPTY_PASSWORD: yes
+ MYSQL_DATABASE: test_sqlkata
+ ports:
+ - 3306
+ options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
steps:
- name: Checkout
uses: actions/checkout@v2
@@ -46,6 +55,11 @@ jobs:
run: dotnet build -c Release --no-restore
- name: Test
run: dotnet test -c Release
+ env:
+ MYSQL_HOST: 127.0.0.1
+ MYSQL_USER: root
+ MYSQL_DB: ${{ job.services.mysql.env.MYSQL_DATABASE }}
+ MYSQL_PORT: ${{ job.services.mysql.ports[3306] }}
- name: Pack QueryBuilder
if: matrix.os == 'ubuntu-latest'
run: dotnet pack -v normal -c Release --no-restore --include-symbols --include-source -p:PackageVersion=$GITHUB_RUN_ID QueryBuilder/QueryBuilder.csproj
From 60897453cdd86efd523d5fdf6474fe3dc9fa02eb Mon Sep 17 00:00:00 2001
From: Ahmad Moussawi
Date: Mon, 8 Aug 2022 17:30:45 +0300
Subject: [PATCH 37/45] Update build.yml
---
.github/workflows/build.yml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 3f3dd3f8..2957fdf8 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -12,7 +12,8 @@ env:
DOTNET_CLI_TELEMETRY_OPTOUT: true
# Project name to pack and publish
PROJECT_NAME: SqlKata
- DOTNET_VERSION: 5.0.201
+ DOTNET_VERSION: 6.0.202
+# DOTNET_VERSION: 5.0.201
# DOTNET_VERSION: 2.2.203
# GitHub Packages Feed settings
GITHUB_FEED: https://nuget.pkg.github.com/sqlkata/
From 4486be6eb6cdb5c0f3267868f7455761853ba092 Mon Sep 17 00:00:00 2001
From: Ahmad Moussawi
Date: Mon, 8 Aug 2022 17:35:55 +0300
Subject: [PATCH 38/45] ACTION: add log for unit test
---
.github/workflows/build.yml | 2 +-
QueryBuilder.Tests/MySqlExecutionTest.cs | 4 +++-
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 2957fdf8..d4eae155 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -59,7 +59,7 @@ jobs:
env:
MYSQL_HOST: 127.0.0.1
MYSQL_USER: root
- MYSQL_DB: ${{ job.services.mysql.env.MYSQL_DATABASE }}
+ MYSQL_DB: test_sqlkata
MYSQL_PORT: ${{ job.services.mysql.ports[3306] }}
- name: Pack QueryBuilder
if: matrix.os == 'ubuntu-latest'
diff --git a/QueryBuilder.Tests/MySqlExecutionTest.cs b/QueryBuilder.Tests/MySqlExecutionTest.cs
index 184612b3..c98a3a5d 100644
--- a/QueryBuilder.Tests/MySqlExecutionTest.cs
+++ b/QueryBuilder.Tests/MySqlExecutionTest.cs
@@ -60,8 +60,10 @@ public QueryFactory SetupDb()
var host = System.Environment.GetEnvironmentVariable("MYSQL_HOST");
var user = System.Environment.GetEnvironmentVariable("MYSQL_USER");
var dbName = System.Environment.GetEnvironmentVariable("MYSQL_DB");
+ var cs = $"server={host};user={user};database={dbName}";
+ Console.WriteLine($"Using cs: {cs}");
- var connection = new MySqlConnection($"server={host};user={user};database={dbName}");
+ var connection = new MySqlConnection(cs);
var db = new QueryFactory(connection, new MySqlCompiler());
From 8cddf3f28457e048262c5936579d17b949a34ba3 Mon Sep 17 00:00:00 2001
From: Ahmad Moussawi
Date: Mon, 8 Aug 2022 17:47:04 +0300
Subject: [PATCH 39/45] ACTION: upgrade mysql and create db from cli
---
.github/workflows/build.yml | 33 +++++++++++++++++++++++----------
1 file changed, 23 insertions(+), 10 deletions(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index d4eae155..dc83f999 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -13,7 +13,7 @@ env:
# Project name to pack and publish
PROJECT_NAME: SqlKata
DOTNET_VERSION: 6.0.202
-# DOTNET_VERSION: 5.0.201
+ # DOTNET_VERSION: 5.0.201
# DOTNET_VERSION: 2.2.203
# GitHub Packages Feed settings
GITHUB_FEED: https://nuget.pkg.github.com/sqlkata/
@@ -27,52 +27,65 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
- os: [ ubuntu-latest ]
+ os: [ubuntu-latest]
services:
mysql:
- image: mysql:5.7
- env:
- MYSQL_ALLOW_EMPTY_PASSWORD: yes
- MYSQL_DATABASE: test_sqlkata
- ports:
- - 3306
- options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
+ image: mysql:8.0
+ env:
+ MYSQL_ALLOW_EMPTY_PASSWORD: yes
+ MYSQL_DATABASE: test_sqlkata
+ ports:
+ - 3306
+ options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
steps:
- name: Checkout
uses: actions/checkout@v2
+
- name: Set env
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
+
- name: Checking release
run: |
echo $RELEASE_VERSION
echo ${{ env.RELEASE_VERSION }}
+
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
+
- name: Restore
run: dotnet restore
+
- name: Build
run: dotnet build -c Release --no-restore
+
+ - name: Test
+ run: mysql -h 127.0.0.1 --port 3306 -u root -e 'CREATE DATABASE IF NOT EXISTS test_sqlkata;'
+
- name: Test
run: dotnet test -c Release
env:
MYSQL_HOST: 127.0.0.1
MYSQL_USER: root
MYSQL_DB: test_sqlkata
- MYSQL_PORT: ${{ job.services.mysql.ports[3306] }}
+ MYSQL_PORT: ${{ job.services.mysql.ports[3306] }}
+
- name: Pack QueryBuilder
if: matrix.os == 'ubuntu-latest'
run: dotnet pack -v normal -c Release --no-restore --include-symbols --include-source -p:PackageVersion=$GITHUB_RUN_ID QueryBuilder/QueryBuilder.csproj
+
- name: Pack SqlKata.Execution
if: matrix.os == 'ubuntu-latest'
run: dotnet pack -v normal -c Release --no-restore --include-symbols --include-source -p:PackageVersion=$GITHUB_RUN_ID SqlKata.Execution/SqlKata.Execution.csproj
+
- name: Upload QueryBuilder Artifact
if: matrix.os == 'ubuntu-latest'
uses: actions/upload-artifact@v2
with:
name: nupkg
path: ./QueryBuilder/bin/Release/*.nupkg
+
- name: Upload SqlKata.Execution Artifact
if: matrix.os == 'ubuntu-latest'
uses: actions/upload-artifact@v2
From 582222fe16d3029b9ea1805c0165c9c52e813caf Mon Sep 17 00:00:00 2001
From: Ahmad Moussawi
Date: Mon, 8 Aug 2022 19:10:07 +0300
Subject: [PATCH 40/45] ACTION: use default MySQL service
---
.github/workflows/build.yml | 33 +++++++++++++++++----------------
1 file changed, 17 insertions(+), 16 deletions(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index dc83f999..0dcae00d 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -22,21 +22,18 @@ env:
# Official NuGet Feed settings
NUGET_FEED: https://api.nuget.org/v3/index.json
NUGET_KEY: ${{ secrets.NUGET_KEY }}
+
+ DB_MYSQL_DATABASE: test_sqlkata
+ DB_MYSQL_USER: root
+ DB_MYSQL_PASSWORD: 'root'
+ DB_MYSQL_HOST: localhost
+
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
- os: [ubuntu-latest]
- services:
- mysql:
- image: mysql:8.0
- env:
- MYSQL_ALLOW_EMPTY_PASSWORD: yes
- MYSQL_DATABASE: test_sqlkata
- ports:
- - 3306
- options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
+ os: [ubuntu-latest]
steps:
- name: Checkout
uses: actions/checkout@v2
@@ -60,16 +57,20 @@ jobs:
- name: Build
run: dotnet build -c Release --no-restore
- - name: Test
- run: mysql -h 127.0.0.1 --port 3306 -u root -e 'CREATE DATABASE IF NOT EXISTS test_sqlkata;'
+ - name: Start MySql
+ run: |
+ sudo /etc/init.d/mysql start
+ mysqladmin -u ${{ env.DB_MYSQL_USER }} -p${{ env.DB_MYSQL_PASSWORD }} password ''
+ mysql -e 'CREATE DATABASE ${{ env.DB_MYSQL_DATABASE }};' -u${{ env.DB_MYSQL_USER }}
+ mysql -e 'CREATE TABLE cars(id int primary key auto_increment);' -u${{ env.DB_MYSQL_USER }} ${{ env.DB_MYSQL_DATABASE }}
+ mysql -e 'SHOW TABLES;' -u${{ env.DB_MYSQL_USER }} ${{ env.DB_MYSQL_DATABASE }}
- name: Test
run: dotnet test -c Release
env:
- MYSQL_HOST: 127.0.0.1
- MYSQL_USER: root
- MYSQL_DB: test_sqlkata
- MYSQL_PORT: ${{ job.services.mysql.ports[3306] }}
+ MYSQL_HOST: ${{ env.DB_MYSQL_HOST }}
+ MYSQL_USER: ${{ env.DB_MYSQL_USER }}
+ MYSQL_DB: ${{ env.DB_MYSQL_DATABASE }}
- name: Pack QueryBuilder
if: matrix.os == 'ubuntu-latest'
From 1ff45a23c7366973fc7b6a7d4b413633faba8707 Mon Sep 17 00:00:00 2001
From: Ahmad Moussawi
Date: Mon, 8 Aug 2022 19:19:16 +0300
Subject: [PATCH 41/45] ACTION: fix version suffix in dotnet pack cli
---
.github/workflows/build.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 0dcae00d..c977041f 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -74,11 +74,11 @@ jobs:
- name: Pack QueryBuilder
if: matrix.os == 'ubuntu-latest'
- run: dotnet pack -v normal -c Release --no-restore --include-symbols --include-source -p:PackageVersion=$GITHUB_RUN_ID QueryBuilder/QueryBuilder.csproj
+ run: dotnet pack -v normal -c Release --no-restore --include-symbols --include-source --version-suffix=$GITHUB_RUN_ID QueryBuilder/QueryBuilder.csproj
- name: Pack SqlKata.Execution
if: matrix.os == 'ubuntu-latest'
- run: dotnet pack -v normal -c Release --no-restore --include-symbols --include-source -p:PackageVersion=$GITHUB_RUN_ID SqlKata.Execution/SqlKata.Execution.csproj
+ run: dotnet pack -v normal -c Release --no-restore --include-symbols --include-source --version-suffix=$GITHUB_RUN_ID SqlKata.Execution/SqlKata.Execution.csproj
- name: Upload QueryBuilder Artifact
if: matrix.os == 'ubuntu-latest'
From 4cf965eebcfe2bf1872b85c07b50a241da912c64 Mon Sep 17 00:00:00 2001
From: Ahmad Moussawi
Date: Mon, 8 Aug 2022 19:23:49 +0300
Subject: [PATCH 42/45] Hide WARNING CS1591: Missing comment on public methods
---
QueryBuilder/QueryBuilder.csproj | 2 +-
SqlKata.Execution/SqlKata.Execution.csproj | 3 +--
2 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/QueryBuilder/QueryBuilder.csproj b/QueryBuilder/QueryBuilder.csproj
index 9ac7b106..d310532d 100755
--- a/QueryBuilder/QueryBuilder.csproj
+++ b/QueryBuilder/QueryBuilder.csproj
@@ -22,7 +22,7 @@
true
true
-
+ CS1591
bin\Debug\netstandard2.0\SqlKata.xml
diff --git a/SqlKata.Execution/SqlKata.Execution.csproj b/SqlKata.Execution/SqlKata.Execution.csproj
index 9d66f194..d5e27aad 100644
--- a/SqlKata.Execution/SqlKata.Execution.csproj
+++ b/SqlKata.Execution/SqlKata.Execution.csproj
@@ -20,8 +20,7 @@
true
true
-
-
+ CS1591
bin\Release\netstandard2.0\SqlKata.Execution.xml
From 355c6231291ded84c6912881a58e2efe7faefedc Mon Sep 17 00:00:00 2001
From: Ahmad Moussawi
Date: Mon, 8 Aug 2022 19:26:23 +0300
Subject: [PATCH 43/45] Fix comment wrong Type parameter
---
QueryBuilder/Compilers/Compiler.cs | 2 --
1 file changed, 2 deletions(-)
diff --git a/QueryBuilder/Compilers/Compiler.cs b/QueryBuilder/Compilers/Compiler.cs
index 98d26fd8..f670bdb8 100644
--- a/QueryBuilder/Compilers/Compiler.cs
+++ b/QueryBuilder/Compilers/Compiler.cs
@@ -894,7 +894,6 @@ public virtual string WrapValue(string value)
///
///
///
- ///
///
public virtual object Resolve(SqlResult ctx, object parameter)
{
@@ -920,7 +919,6 @@ public virtual object Resolve(SqlResult ctx, object parameter)
///
///
///
- ///
///
public virtual string Parameter(SqlResult ctx, object parameter)
{
From 4f2c6de0d361d3a71cd5d91a5e75b479e26163a3 Mon Sep 17 00:00:00 2001
From: Ahmad Moussawi
Date: Mon, 8 Aug 2022 19:26:55 +0300
Subject: [PATCH 44/45] Constant should be first
---
QueryBuilder.Tests/MySqlExecutionTest.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/QueryBuilder.Tests/MySqlExecutionTest.cs b/QueryBuilder.Tests/MySqlExecutionTest.cs
index c98a3a5d..51d89fd6 100644
--- a/QueryBuilder.Tests/MySqlExecutionTest.cs
+++ b/QueryBuilder.Tests/MySqlExecutionTest.cs
@@ -50,7 +50,7 @@ Color TEXT NULL
var rows = db.Query("Cars").Get().ToList();
- Assert.Equal(rows.Count(), 1);
+ Assert.Equal(1, rows.Count());
db.Statement("DROP TABLE IF EXISTS `Cars`");
}
From 064adccabd4e9d9dd54fa7dbd9e609610e10730e Mon Sep 17 00:00:00 2001
From: Ahmad Moussawi
Date: Mon, 8 Aug 2022 19:28:27 +0300
Subject: [PATCH 45/45] remove All Contributors from Readme
---
README.md | 25 +------------------------
1 file changed, 1 insertion(+), 24 deletions(-)
diff --git a/README.md b/README.md
index ef0ea96e..649a7e8b 100644
--- a/README.md
+++ b/README.md
@@ -6,9 +6,6 @@
-
-
-
@@ -165,24 +162,4 @@ int affected = db.Query("Users").Where("Id", 1).Update(new {
```cs
int affected = db.Query("Users").Where("Id", 1).Delete();
-```
-
-## Contributors ✨
-
-Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
-
-
-
-
-
-
-
-
-
-
-
-This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
+```
\ No newline at end of file