Skip to content

Commit 4dafb25

Browse files
authored
Merge pull request #1691 from fredericDelaporte/bitwiseOperatorAdjustments
Bitwise operator adjustments
2 parents c2b3968 + a822d49 commit 4dafb25

File tree

9 files changed

+63
-35
lines changed

9 files changed

+63
-35
lines changed

src/NHibernate.Test/TestCase.cs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -447,19 +447,6 @@ protected DateTime RoundForDialect(DateTime value)
447447
{"locate", new HashSet<System.Type> {typeof (SQLiteDialect)}},
448448
{"bit_length", new HashSet<System.Type> {typeof (SQLiteDialect)}},
449449
{"extract", new HashSet<System.Type> {typeof (SQLiteDialect)}},
450-
{
451-
"bxor",
452-
new HashSet<System.Type>
453-
{
454-
// Could be supported like Oracle, with a template
455-
typeof (SQLiteDialect),
456-
// Could be supported by overriding registration with # instead of ^
457-
typeof (PostgreSQLDialect),
458-
typeof (PostgreSQL81Dialect),
459-
typeof (PostgreSQL82Dialect),
460-
typeof (PostgreSQL83Dialect)
461-
}
462-
},
463450
{
464451
"nullif",
465452
new HashSet<System.Type>

src/NHibernate/Dialect/Dialect.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,10 +117,10 @@ protected Dialect()
117117
RegisterFunction("year", new SQLFunctionTemplate(NHibernateUtil.Int32, "extract(year from ?1)"));
118118

119119
// Bitwise operations
120-
RegisterFunction("band", new BitwiseNativeOperation("&"));
121-
RegisterFunction("bor", new BitwiseNativeOperation("|"));
122-
RegisterFunction("bxor", new BitwiseNativeOperation("^"));
123-
RegisterFunction("bnot", new BitwiseNativeOperation("~", true));
120+
RegisterFunction("band", new Function.BitwiseNativeOperation("&"));
121+
RegisterFunction("bor", new Function.BitwiseNativeOperation("|"));
122+
RegisterFunction("bxor", new Function.BitwiseNativeOperation("^"));
123+
RegisterFunction("bnot", new Function.BitwiseNativeOperation("~", true));
124124

125125
RegisterFunction("str", new SQLFunctionTemplate(NHibernateUtil.String, "cast(?1 as char)"));
126126

src/NHibernate/Dialect/FirebirdDialect.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -422,10 +422,10 @@ private void OverrideStandardHQLFunctions()
422422
RegisterFunction("sysdate", new CastedFunction("today", NHibernateUtil.Date));
423423
RegisterFunction("date", new SQLFunctionTemplate(NHibernateUtil.Date, "cast(?1 as date)"));
424424
// Bitwise operations
425-
RegisterFunction("band", new BitwiseFunctionOperation("bin_and"));
426-
RegisterFunction("bor", new BitwiseFunctionOperation("bin_or"));
427-
RegisterFunction("bxor", new BitwiseFunctionOperation("bin_xor"));
428-
RegisterFunction("bnot", new BitwiseFunctionOperation("bin_not"));
425+
RegisterFunction("band", new Function.BitwiseFunctionOperation("bin_and"));
426+
RegisterFunction("bor", new Function.BitwiseFunctionOperation("bin_or"));
427+
RegisterFunction("bxor", new Function.BitwiseFunctionOperation("bin_xor"));
428+
RegisterFunction("bnot", new Function.BitwiseFunctionOperation("bin_not"));
429429
}
430430

431431
private void RegisterFirebirdServerEmbeddedFunctions()

src/NHibernate/Dialect/BitwiseFunctionOperation.cs renamed to src/NHibernate/Dialect/Function/BitwiseFunctionOperation.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,27 @@
11
using System;
22
using System.Collections;
3-
using NHibernate.Dialect.Function;
43
using NHibernate.Engine;
54
using NHibernate.SqlCommand;
65
using NHibernate.Type;
76

7+
// 6.0 TODO: remove NHibernate.Dialect.BitwiseFunctionOperation,
8+
// and remove "Function." prefix where the non obsolete one is used.
89
namespace NHibernate.Dialect
10+
{
11+
/// <inheritdoc />
12+
[Serializable]
13+
// Since 5.2
14+
[Obsolete("Use NHibernate.Dialect.Function.BitwiseFunctionOperation instead")]
15+
public class BitwiseFunctionOperation : Function.BitwiseFunctionOperation
16+
{
17+
/// <inheritdoc />
18+
public BitwiseFunctionOperation(string functionName): base(functionName)
19+
{
20+
}
21+
}
22+
}
23+
24+
namespace NHibernate.Dialect.Function
925
{
1026
/// <summary>
1127
/// Treats bitwise operations as SQL function calls.

src/NHibernate/Dialect/BitwiseNativeOperation.cs renamed to src/NHibernate/Dialect/Function/BitwiseNativeOperation.cs

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,32 @@
11
using System;
22
using System.Collections;
3-
using NHibernate.Dialect.Function;
43
using NHibernate.Engine;
54
using NHibernate.SqlCommand;
65
using NHibernate.Type;
76

7+
// 6.0 TODO: remove NHibernate.Dialect.BitwiseNativeOperation,
8+
// and remove "Function." prefix where the non obsolete one is used.
89
namespace NHibernate.Dialect
10+
{
11+
/// <inheritdoc />
12+
[Serializable]
13+
// Since 5.2
14+
[Obsolete("Use NHibernate.Dialect.Function.BitwiseNativeOperation instead")]
15+
public class BitwiseNativeOperation : Function.BitwiseNativeOperation
16+
{
17+
/// <inheritdoc />
18+
public BitwiseNativeOperation(string sqlOpToken) : base(sqlOpToken)
19+
{
20+
}
21+
22+
/// <inheritdoc />
23+
public BitwiseNativeOperation(string sqlOpToken, bool isNot) : base(sqlOpToken, isNot)
24+
{
25+
}
26+
}
27+
}
28+
29+
namespace NHibernate.Dialect.Function
930
{
1031
/// <summary>
1132
/// Treats bitwise operations as native operations.
@@ -14,7 +35,7 @@ namespace NHibernate.Dialect
1435
public class BitwiseNativeOperation : ISQLFunction
1536
{
1637
private readonly string _sqlOpToken;
17-
private readonly bool _isNot;
38+
private readonly bool _isUnary;
1839

1940
/// <summary>
2041
/// Creates an instance using the giving token.
@@ -34,11 +55,11 @@ public BitwiseNativeOperation(string sqlOpToken)
3455
/// Creates an instance using the giving token and the flag indicating if it is an unary operator.
3556
/// </summary>
3657
/// <param name="sqlOpToken">The operation token.</param>
37-
/// <param name="isNot">Whether the operation is unary or not.</param>
38-
public BitwiseNativeOperation(string sqlOpToken, bool isNot)
58+
/// <param name="isUnary">Whether the operation is unary or not.</param>
59+
public BitwiseNativeOperation(string sqlOpToken, bool isUnary)
3960
{
4061
_sqlOpToken = sqlOpToken;
41-
_isNot = isNot;
62+
_isUnary = isUnary;
4263
}
4364

4465
#region ISQLFunction Members
@@ -63,11 +84,11 @@ public SqlString Render(IList args, ISessionFactoryImplementor factory)
6384

6485
var sqlBuffer = new SqlStringBuilder();
6586

66-
if (!_isNot)
87+
if (!_isUnary)
6788
AddToBuffer(args[0], sqlBuffer);
6889

6990
sqlBuffer.Add(" ").Add(_sqlOpToken).Add(" ");
70-
for (var i = _isNot ? 0 : 1; i < args.Count; i++)
91+
for (var i = _isUnary ? 0 : 1; i < args.Count; i++)
7192
{
7293
AddToBuffer(args[i], sqlBuffer);
7394
}

src/NHibernate/Dialect/HanaDialectBase.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -384,10 +384,10 @@ protected virtual void RegisterFunctions()
384384

385385
protected virtual void RegisterNHibernateFunctions()
386386
{
387-
RegisterFunction("band", new BitwiseFunctionOperation("bitand"));
388-
RegisterFunction("bor", new BitwiseFunctionOperation("bitor"));
389-
RegisterFunction("bxor", new BitwiseFunctionOperation("bitxor"));
390-
RegisterFunction("bnot", new BitwiseFunctionOperation("bitnot"));
387+
RegisterFunction("band", new Function.BitwiseFunctionOperation("bitand"));
388+
RegisterFunction("bor", new Function.BitwiseFunctionOperation("bitor"));
389+
RegisterFunction("bxor", new Function.BitwiseFunctionOperation("bitxor"));
390+
RegisterFunction("bnot", new Function.BitwiseFunctionOperation("bitnot"));
391391
RegisterFunction("bit_length", new SQLFunctionTemplate(NHibernateUtil.Int32, "length(to_binary(?1))*8"));
392392
RegisterFunction("ceiling", new StandardSQLFunction("ceil"));
393393
RegisterFunction("chr", new StandardSQLFunction("char", NHibernateUtil.AnsiChar));

src/NHibernate/Dialect/Oracle8iDialect.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ protected virtual void RegisterFunctions()
303303

304304
RegisterFunction("iif", new SQLFunctionTemplate(null, "case when ?1 then ?2 else ?3 end"));
305305

306-
RegisterFunction("band", new BitwiseFunctionOperation("bitand"));
306+
RegisterFunction("band", new Function.BitwiseFunctionOperation("bitand"));
307307
RegisterFunction("bor", new SQLFunctionTemplate(null, "?1 + ?2 - BITAND(?1, ?2)"));
308308
RegisterFunction("bxor", new SQLFunctionTemplate(null, "?1 + ?2 - BITAND(?1, ?2) * 2"));
309309
RegisterFunction("bnot", new SQLFunctionTemplate(null, "(-1 - ?1)"));

src/NHibernate/Dialect/PostgreSQLDialect.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public PostgreSQLDialect()
8484
RegisterFunction("atan2", new StandardSQLFunction("atan2", NHibernateUtil.Double));
8585

8686
RegisterFunction("power", new StandardSQLFunction("power", NHibernateUtil.Double));
87-
RegisterFunction("bxor", new BitwiseNativeOperation("#"));
87+
RegisterFunction("bxor", new Function.BitwiseNativeOperation("#"));
8888

8989
RegisterFunction("floor", new StandardSQLFunction("floor"));
9090
RegisterFunction("ceiling", new StandardSQLFunction("ceiling"));

src/NHibernate/Dialect/SQLiteDialect.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ protected virtual void RegisterFunctions()
8888

8989
RegisterFunction("round", new StandardSQLFunction("round"));
9090

91+
// SQLite has no built-in support of bitwise xor, but can emulate it.
92+
// http://sqlite.1065341.n5.nabble.com/XOR-operator-td98004.html
93+
RegisterFunction("bxor", new SQLFunctionTemplate(null, "((?1 | ?2) - (?1 & ?2))"));
94+
9195
// NH-3787: SQLite requires the cast in SQL too for not defaulting to string.
9296
RegisterFunction("transparentcast", new CastFunction());
9397
}

0 commit comments

Comments
 (0)