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 Twitter 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 @@

+ +[![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#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)): + + + + + + + + +

mnsrulz

💻
+ + + + + + +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 @@

- -[![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors-) - SqlKata Query Builder

-

- Twitter + +All Contributors + + Twitter

+ + > **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 Twitter 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 @@ - -All Contributors - Twitter

@@ -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)): - - - - - - - - -

mnsrulz

💻
- - - - - - -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