|
From: <jul...@us...> - 2011-03-24 17:19:50
|
Revision: 5518
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5518&view=rev
Author: julian-maughan
Date: 2011-03-24 17:19:43 +0000 (Thu, 24 Mar 2011)
Log Message:
-----------
Added data-type keywords to SQL Server dialects (NH-2554). Also updated the class-level XML comment block to reflect some recent changes to default properties.
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Dialect/MsSql2000Dialect.cs
trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs
trunk/nhibernate/src/NHibernate/Dialect/MsSql2008Dialect.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2554/
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2554/Fixture.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2554/Mappings.hbm.xml
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2554/Model.cs
Modified: trunk/nhibernate/src/NHibernate/Dialect/MsSql2000Dialect.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Dialect/MsSql2000Dialect.cs 2011-03-24 02:51:16 UTC (rev 5517)
+++ trunk/nhibernate/src/NHibernate/Dialect/MsSql2000Dialect.cs 2011-03-24 17:19:43 UTC (rev 5518)
@@ -21,22 +21,22 @@
/// <remarks>
/// The MsSql2000Dialect defaults the following configuration properties:
/// <list type="table">
- /// <listheader>
- /// <term>Property</term>
- /// <description>Default Value</description>
- /// </listheader>
- /// <item>
- /// <term>use_outer_join</term>
- /// <description><see langword="true" /></description>
- /// </item>
- /// <item>
- /// <term>connection.driver_class</term>
- /// <description><see cref="NHibernate.Driver.SqlClientDriver" /></description>
- /// </item>
- /// <item>
- /// <term>prepare_sql</term>
- /// <description><see langword="false" /></description>
- /// </item>
+ /// <listheader>
+ /// <term>Property</term>
+ /// <description>Default Value</description>
+ /// </listheader>
+ /// <item>
+ /// <term>connection.driver_class</term>
+ /// <description><see cref="NHibernate.Driver.SqlClientDriver" /></description>
+ /// </item>
+ /// <item>
+ /// <term>adonet.batch_size</term>
+ /// <description>10</description>
+ /// </item>
+ /// <item>
+ /// <term>query.substitutions</term>
+ /// <description>true 1, false 0, yes 'Y', no 'N'</description>
+ /// </item>
/// </list>
/// </remarks>
public class MsSql2000Dialect : Dialect
@@ -66,9 +66,34 @@
protected virtual void RegisterKeywords()
{
RegisterKeyword("top");
- RegisterKeyword("integer");
RegisterKeyword("int");
+ RegisterKeyword("integer"); // a commonly-used alias for 'int'
+ RegisterKeyword("tinyint");
+ RegisterKeyword("smallint");
+ RegisterKeyword("bigint");
+ RegisterKeyword("numeric");
+ RegisterKeyword("decimal");
+ RegisterKeyword("bit");
+ RegisterKeyword("money");
+ RegisterKeyword("smallmoney");
+ RegisterKeyword("float");
+ RegisterKeyword("real");
RegisterKeyword("datetime");
+ RegisterKeyword("smalldatetime");
+ RegisterKeyword("char");
+ RegisterKeyword("varchar");
+ RegisterKeyword("text");
+ RegisterKeyword("nchar");
+ RegisterKeyword("nvarchar");
+ RegisterKeyword("ntext");
+ RegisterKeyword("binary");
+ RegisterKeyword("varbinary");
+ RegisterKeyword("image");
+ RegisterKeyword("cursor");
+ RegisterKeyword("timestamp");
+ RegisterKeyword("uniqueidentifier");
+ RegisterKeyword("sql_variant");
+ RegisterKeyword("table");
}
protected virtual void RegisterFunctions()
@@ -110,7 +135,6 @@
RegisterFunction("right", new SQLFunctionTemplate(NHibernateUtil.String, "right(?1, ?2)"));
RegisterFunction("locate", new StandardSQLFunction("charindex", NHibernateUtil.Int32));
-
RegisterFunction("current_timestamp", new NoArgSQLFunction("getdate", NHibernateUtil.DateTime, true));
RegisterFunction("second", new SQLFunctionTemplate(NHibernateUtil.Int32, "datepart(second, ?1)"));
RegisterFunction("minute", new SQLFunctionTemplate(NHibernateUtil.Int32, "datepart(minute, ?1)"));
@@ -149,6 +173,8 @@
protected virtual void RegisterDateTimeTypeMappings()
{
RegisterColumnType(DbType.Time, "DATETIME");
+ RegisterColumnType(DbType.Date, "DATETIME");
+ RegisterColumnType(DbType.DateTime, "DATETIME");
}
protected virtual void RegisterNumericTypeMappings()
@@ -156,15 +182,13 @@
RegisterColumnType(DbType.Boolean, "BIT");
RegisterColumnType(DbType.Byte, "TINYINT");
RegisterColumnType(DbType.Currency, "MONEY");
- RegisterColumnType(DbType.Date, "DATETIME");
- RegisterColumnType(DbType.DateTime, "DATETIME");
RegisterColumnType(DbType.Decimal, "DECIMAL(19,5)");
RegisterColumnType(DbType.Decimal, 19, "DECIMAL($p, $s)");
RegisterColumnType(DbType.Double, "DOUBLE PRECISION"); //synonym for FLOAT(53)
RegisterColumnType(DbType.Int16, "SMALLINT");
RegisterColumnType(DbType.Int32, "INT");
RegisterColumnType(DbType.Int64, "BIGINT");
- RegisterColumnType(DbType.Single, "REAL"); //synonym for FLOAT(24)
+ RegisterColumnType(DbType.Single, "REAL"); //synonym for FLOAT(24)
}
protected virtual void RegisterCharacterTypeMappings()
@@ -181,13 +205,11 @@
RegisterColumnType(DbType.String, SqlClientDriver.MaxSizeForClob, "NTEXT");
}
- /// <summary></summary>
public override string AddColumnString
{
get { return "add"; }
}
- /// <summary></summary>
public override string NullColumnString
{
get { return " null"; }
@@ -213,7 +235,6 @@
get { return true; }
}
- /// <summary></summary>
public override bool QualifyIndexName
{
get { return false; }
@@ -253,7 +274,6 @@
get { return true; }
}
- /// <summary></summary>
public override bool SupportsIdentityColumns
{
get { return true; }
@@ -264,25 +284,21 @@
get { return "select SCOPE_IDENTITY()"; }
}
- /// <summary></summary>
public override string IdentityColumnString
{
get { return "IDENTITY NOT NULL"; }
}
- /// <summary></summary>
public override string NoColumnsInsertString
{
get { return "DEFAULT VALUES"; }
}
- /// <summary></summary>
public override char CloseQuote
{
get { return ']'; }
}
- /// <summary></summary>
public override char OpenQuote
{
get { return '['; }
@@ -359,9 +375,7 @@
return true;
}
- /// <summary>
- ///
- /// </summary>
+ /// <summary />
/// <param name="name"></param>
/// <returns></returns>
/// <remarks>
@@ -373,11 +387,6 @@
return OpenQuote + name.Replace(CloseQuote.ToString(), new string(CloseQuote, 2)) + CloseQuote;
}
- /// <summary>
- ///
- /// </summary>
- /// <param name="quoted"></param>
- /// <returns></returns>
public override string UnQuote(string quoted)
{
if (IsQuoted(quoted))
@@ -505,13 +514,11 @@
string selectExistingObject = GetSelectExistingObject(name, table);
return string.Format(@"if not exists ({0})", selectExistingObject);
}
+
[Serializable]
protected class CountBigQueryFunction : ClassicAggregateFunction
{
- public CountBigQueryFunction()
- : base("count_big", true)
- {
- }
+ public CountBigQueryFunction() : base("count_big", true) { }
public override IType ReturnType(IType columnType, IMapping mapping)
{
@@ -542,15 +549,12 @@
public override bool SupportsSqlBatches
{
- get
- {
- return true;
- }
+ get { return true; }
}
public override bool IsKnownToken(string currentToken, string nextToken)
{
- return currentToken == "n" && nextToken == "'"; // unicode character
+ return currentToken == "n" && nextToken == "'"; // unicode character
}
}
}
Modified: trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs 2011-03-24 02:51:16 UTC (rev 5517)
+++ trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs 2011-03-24 17:19:43 UTC (rev 5518)
@@ -22,6 +22,12 @@
RegisterColumnType(DbType.AnsiString, SqlClientDriver.MaxSizeForAnsiClob, "VARCHAR(MAX)");
RegisterColumnType(DbType.Binary, SqlClientDriver.MaxSizeForBlob, "VARBINARY(MAX)");
}
+
+ protected override void RegisterKeywords()
+ {
+ base.RegisterKeywords();
+ RegisterKeyword("xml");
+ }
/// <summary>
/// Add a <c>LIMIT</c> clause to the given SQL <c>SELECT</c>
@@ -63,7 +69,7 @@
SqlString fromAndWhere;
SqlString[] sortExpressions;
- //don't use the order index if it is contained within a larger statement(assuming
+ //don't use the order index if it is contained within a larger statement(assuming
//a statement with non matching parenthesis is part of a larger block)
if (orderIndex > 0 && HasMatchingParens(querySqlString.Substring(orderIndex).ToString()))
{
@@ -76,7 +82,7 @@
fromAndWhere = querySqlString.Substring(fromIndex).Trim();
// Use dummy sort to avoid errors
sortExpressions = new[] {new SqlString("CURRENT_TIMESTAMP"),};
- }
+ }
result
.Add("SELECT TOP (")
@@ -156,7 +162,7 @@
return 6;
}
throw new NotSupportedException("The query should start with 'SELECT' or 'SELECT DISTINCT'");
- }
+ }
/// <summary>
/// Indicates whether the string fragment contains matching parenthesis
@@ -206,17 +212,17 @@
get { return true; }
}
- public override bool BindLimitParametersInReverseOrder
+ public override bool BindLimitParametersInReverseOrder
{
get { return true; }
}
- public override bool SupportsVariableLimit
- {
- get { return true; }
+ public override bool SupportsVariableLimit
+ {
+ get { return true; }
}
- public override bool BindLimitParametersFirst
+ public override bool BindLimitParametersFirst
{
get { return true; }
}
Modified: trunk/nhibernate/src/NHibernate/Dialect/MsSql2008Dialect.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Dialect/MsSql2008Dialect.cs 2011-03-24 02:51:16 UTC (rev 5517)
+++ trunk/nhibernate/src/NHibernate/Dialect/MsSql2008Dialect.cs 2011-03-24 17:19:43 UTC (rev 5518)
@@ -24,8 +24,11 @@
protected override void RegisterKeywords()
{
base.RegisterKeywords();
+ RegisterKeyword("date");
+ RegisterKeyword("datetimeoffset");
RegisterKeyword("datetime2");
- RegisterKeyword("datetimeoffset");
+ RegisterKeyword("time");
+ RegisterKeyword("hierarchyid");
}
}
}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2554/Fixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2554/Fixture.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2554/Fixture.cs 2011-03-24 17:19:43 UTC (rev 5518)
@@ -0,0 +1,92 @@
+using System;
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.NH2554
+{
+ [TestFixture]
+ public class Fixture: BugTestCase
+ {
+ protected override bool AppliesTo(NHibernate.Dialect.Dialect dialect)
+ {
+ return (dialect is NHibernate.Dialect.MsSql2005Dialect) || (dialect is NHibernate.Dialect.MsSql2008Dialect);
+ }
+
+ protected override void Configure(NHibernate.Cfg.Configuration configuration)
+ {
+ configuration.SetProperty(NHibernate.Cfg.Environment.Hbm2ddlKeyWords, "keywords");
+ base.Configure(configuration);
+ }
+
+ protected override void OnSetUp()
+ {
+ base.OnSetUp();
+
+ using (ISession session = Sfi.OpenSession())
+ using (ITransaction transaction = session.BeginTransaction())
+ {
+ session.Persist(new Student() { FullName = "Julian Maughan" });
+ transaction.Commit();
+ }
+ }
+
+ protected override void OnTearDown()
+ {
+ using (ISession session = Sfi.OpenSession())
+ using (ITransaction transaction = session.BeginTransaction())
+ {
+ session.CreateQuery("delete from Student").ExecuteUpdate();
+ transaction.Commit();
+ }
+
+ base.OnTearDown();
+ }
+
+ [Test]
+ public void TestMappedFormulasContainingSqlServerDataTypeKeywords()
+ {
+ using (ISession session = Sfi.OpenSession())
+ using (ITransaction transaction = session.BeginTransaction())
+ {
+ var students = session.CreateQuery("from Student").List<Student>();
+ Assert.That(students.Count, Is.EqualTo(1));
+ Assert.That(students[0].FullName, Is.StringMatching("Julian Maughan"));
+ Assert.That(students[0].FullNameAsVarBinary.Length, Is.EqualTo(28));
+ Assert.That(students[0].FullNameAsVarBinary512.Length, Is.EqualTo(28));
+ // Assert.That(students[0].FullNameAsBinary.Length, Is.EqualTo(28)); 30???
+ Assert.That(students[0].FullNameAsBinary256.Length, Is.EqualTo(256));
+ Assert.That(students[0].FullNameAsVarChar.Length, Is.EqualTo(14));
+ Assert.That(students[0].FullNameAsVarChar125.Length, Is.EqualTo(14));
+
+ transaction.Commit();
+ }
+ }
+
+ [Test]
+ public void TestHqlStatementsContainingSqlServerDataTypeKeywords()
+ {
+ using (ISession session = Sfi.OpenSession())
+ using (ITransaction transaction = session.BeginTransaction())
+ {
+ var students = session
+ .CreateQuery("from Student where length(convert(varbinary, FullName)) = 28")
+ .List<Student>();
+
+ Assert.That(students.Count, Is.EqualTo(1));
+
+ students = session
+ .CreateQuery("from Student where length(convert(varbinary(256), FullName)) = 28")
+ .List<Student>();
+
+ Assert.That(students.Count, Is.EqualTo(1));
+
+ students = session
+ .CreateQuery("from Student where convert(int, 1) = 1")
+ .List<Student>();
+
+ Assert.That(students.Count, Is.EqualTo(1));
+
+ transaction.Commit();
+ }
+ }
+ }
+}
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2554/Mappings.hbm.xml
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2554/Mappings.hbm.xml (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2554/Mappings.hbm.xml 2011-03-24 17:19:43 UTC (rev 5518)
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<hibernate-mapping
+ xmlns="urn:nhibernate-mapping-2.2"
+ assembly="NHibernate.Test"
+ namespace="NHibernate.Test.NHSpecificTest.NH2554">
+
+ <class name="Student">
+
+ <id name="Id">
+ <generator class="guid" />
+ </id>
+
+ <property name="FullName">
+ <column name="full_name" sql-type="nvarchar(255)" not-null="true" />
+ </property>
+
+ <property name="FullNameAsVarBinary" formula="CONVERT(varbinary, full_name)" />
+
+ <property name="FullNameAsVarBinary512" formula="CONVERT(varbinary(512), full_name)" />
+
+ <property name="FullNameAsBinary" formula="CONVERT(binary, full_name)" />
+
+ <property name="FullNameAsBinary256" formula="CONVERT(binary(256), full_name)" />
+
+ <property name="FullNameAsVarChar" formula="CONVERT(varchar, full_name)" />
+
+ <property name="FullNameAsVarChar125" formula="CONVERT(varchar(125), 'Julian Maughan')" />
+
+ </class>
+
+</hibernate-mapping>
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2554/Model.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2554/Model.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2554/Model.cs 2011-03-24 17:19:43 UTC (rev 5518)
@@ -0,0 +1,16 @@
+using System;
+
+namespace NHibernate.Test.NHSpecificTest.NH2554
+{
+ public class Student
+ {
+ public virtual Guid Id { get; set; }
+ public virtual string FullName { get; set; }
+ public virtual byte[] FullNameAsVarBinary { get; set; }
+ public virtual byte[] FullNameAsVarBinary512 { get; set; }
+ public virtual byte[] FullNameAsBinary { get; set; }
+ public virtual byte[] FullNameAsBinary256 { get; set; }
+ public virtual string FullNameAsVarChar { get; set; }
+ public virtual string FullNameAsVarChar125 { get; set; }
+ }
+}
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-03-24 02:51:16 UTC (rev 5517)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-03-24 17:19:43 UTC (rev 5518)
@@ -655,6 +655,8 @@
<Compile Include="NHSpecificTest\NH2507\Fixture.cs" />
<Compile Include="NHSpecificTest\NH2530\Domain.cs" />
<Compile Include="NHSpecificTest\NH2530\Fixture.cs" />
+ <Compile Include="NHSpecificTest\NH2554\Fixture.cs" />
+ <Compile Include="NHSpecificTest\NH2554\Model.cs" />
<Compile Include="NHSpecificTest\NH2565\Domain.cs" />
<Compile Include="NHSpecificTest\NH2565\Fixture.cs" />
<Compile Include="NHSpecificTest\NH2580\Fixture.cs" />
@@ -2000,6 +2002,7 @@
<EmbeddedResource Include="ReadOnly\Enrolment.hbm.xml" />
<EmbeddedResource Include="ReadOnly\TextHolder.hbm.xml" />
<EmbeddedResource Include="ReadOnly\VersionedNode.hbm.xml" />
+ <EmbeddedResource Include="NHSpecificTest\NH2554\Mappings.hbm.xml" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NHibernate.DomainModel\NHibernate.DomainModel.csproj">
@@ -2875,6 +2878,7 @@
<EmbeddedResource Include="DynamicEntity\Tuplizer\Customer.hbm.xml" />
</ItemGroup>
<ItemGroup>
+ <Folder Include="NHSpecificTest\NH2554" />
<Folder Include="Properties\" />
</ItemGroup>
<ItemGroup>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|