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