You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ibatis.apache.org by "Clinton Begin (JIRA)" <ib...@incubator.apache.org> on 2005/11/30 22:32:31 UTC

[jira] Commented: (IBATISNET-118) CacheKey.Equals(object) override can return true when the parameters have the same HashCode but are not equal.

    [ http://issues.apache.org/jira/browse/IBATISNET-118?page=comments#action_12358971 ] 

Clinton Begin commented on IBATISNET-118:
-----------------------------------------


Hey guys, would you like me to fix this one?


> CacheKey.Equals(object) override can return true when the parameters have the same HashCode but are not equal.
> --------------------------------------------------------------------------------------------------------------
>
>          Key: IBATISNET-118
>          URL: http://issues.apache.org/jira/browse/IBATISNET-118
>      Project: iBatis for .NET
>         Type: Bug
>   Components: DataMapper
>     Versions: DataMapper 1.2.1
>  Environment: Windows
>     Reporter: Thomas Tannahill
>     Assignee: Gilles Bayon
>      Fix For: DataMapper 1.3

>
> CacheKey.Equals(object) override can return true when the parameters have the same HashCode but are not equal.  This can cause false cache hits.
> Only an issue for complex parameters.
> Failing NUnit test:
> ---- UNIT TEST BEGIN ----
> using IBatisNet.DataMapper;
> using IBatisNet.DataMapper.TypeHandlers;
> using NUnit.Framework;
> namespace IBatisNet.DataAccess
> {
> 	[TestFixture]
> 	public class CacheKeyTests
> 	{
> 		private const long A_LONG = 1L;
> 		private const long ANOTHER_LONG_WITH_SAME_HASHCODE = -9223372034707292159;
> 		
> 		public CacheKeyTests()
> 		{
> 		}
> 		[Test]
> 		public void ShouldNotBeConsideredEqualWhenParametersHaveTheSameHashCodeButAreNotEqual()
> 		{
> 			TypeHandlerFactory factory = new TypeHandlerFactory(); 
> 			// Two cache keys are equal except for the parameter.
> 			CacheKey key = new CacheKey(factory, "STATEMENT", "SQL", new TestClass(A_LONG), new string[] {"AProperty"}, 0, 0, CacheKeyType.Object);
> 			CacheKey aDifferentKey = new CacheKey(factory, "STATEMENT", "SQL", new TestClass(ANOTHER_LONG_WITH_SAME_HASHCODE), new string[] {"AProperty"}, 0, 0, CacheKeyType.Object);
> 			Assert.IsFalse(aDifferentKey.Equals(key)); // should not be equal.
> 		}
> 	}
> 	public class TestClass
> 	{
> 		private long aProperty;
> 		public TestClass(long aProperty)
> 		{
> 			this.aProperty = aProperty;
> 		}
> 		public long AProperty
> 		{
> 			get { return aProperty; }
> 			set { aProperty = value; }
> 		}
> 	}
> }
> ---- UNIT TEST END ----
> The test passes if you replace this line in CacheKey.Equals():
>                if (_hashCode != cacheKey._hashCode) return false;
> with something like this:
>                if (this._parameter == null && cacheKey._parameter != null) return false;
>                if (this._parameter != null && cacheKey._parameter == null) return false;
>                if (!this._parameter.Equals(cacheKey._parameter)) return false;

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


Re: [jira] Commented: (IBATISNET-118) CacheKey.Equals(object) override can return true when the parameters have the same HashCode but are not equal.

Posted by Nathan Maves <Na...@Sun.COM>.
I would but I am still working on getting the ant build process to  
work on my machine.  I am close :)

Nathan

On Nov 30, 2005, at 2:32 PM, Clinton Begin (JIRA) wrote:

>     [ http://issues.apache.org/jira/browse/IBATISNET-118? 
> page=comments#action_12358971 ]
>
> Clinton Begin commented on IBATISNET-118:
> -----------------------------------------
>
>
> Hey guys, would you like me to fix this one?
>
>
>> CacheKey.Equals(object) override can return true when the  
>> parameters have the same HashCode but are not equal.
>> --------------------------------------------------------------------- 
>> -----------------------------------------
>>
>>          Key: IBATISNET-118
>>          URL: http://issues.apache.org/jira/browse/IBATISNET-118
>>      Project: iBatis for .NET
>>         Type: Bug
>>   Components: DataMapper
>>     Versions: DataMapper 1.2.1
>>  Environment: Windows
>>     Reporter: Thomas Tannahill
>>     Assignee: Gilles Bayon
>>      Fix For: DataMapper 1.3
>
>>
>> CacheKey.Equals(object) override can return true when the  
>> parameters have the same HashCode but are not equal.  This can  
>> cause false cache hits.
>> Only an issue for complex parameters.
>> Failing NUnit test:
>> ---- UNIT TEST BEGIN ----
>> using IBatisNet.DataMapper;
>> using IBatisNet.DataMapper.TypeHandlers;
>> using NUnit.Framework;
>> namespace IBatisNet.DataAccess
>> {
>> 	[TestFixture]
>> 	public class CacheKeyTests
>> 	{
>> 		private const long A_LONG = 1L;
>> 		private const long ANOTHER_LONG_WITH_SAME_HASHCODE =  
>> -9223372034707292159;
>> 		
>> 		public CacheKeyTests()
>> 		{
>> 		}
>> 		[Test]
>> 		public void  
>> ShouldNotBeConsideredEqualWhenParametersHaveTheSameHashCodeButAreNotE 
>> qual()
>> 		{
>> 			TypeHandlerFactory factory = new TypeHandlerFactory();
>> 			// Two cache keys are equal except for the parameter.
>> 			CacheKey key = new CacheKey(factory, "STATEMENT", "SQL", new  
>> TestClass(A_LONG), new string[] {"AProperty"}, 0, 0,  
>> CacheKeyType.Object);
>> 			CacheKey aDifferentKey = new CacheKey(factory, "STATEMENT",  
>> "SQL", new TestClass(ANOTHER_LONG_WITH_SAME_HASHCODE), new string 
>> [] {"AProperty"}, 0, 0, CacheKeyType.Object);
>> 			Assert.IsFalse(aDifferentKey.Equals(key)); // should not be equal.
>> 		}
>> 	}
>> 	public class TestClass
>> 	{
>> 		private long aProperty;
>> 		public TestClass(long aProperty)
>> 		{
>> 			this.aProperty = aProperty;
>> 		}
>> 		public long AProperty
>> 		{
>> 			get { return aProperty; }
>> 			set { aProperty = value; }
>> 		}
>> 	}
>> }
>> ---- UNIT TEST END ----
>> The test passes if you replace this line in CacheKey.Equals():
>>                if (_hashCode != cacheKey._hashCode) return false;
>> with something like this:
>>                if (this._parameter == null && cacheKey._parameter ! 
>> = null) return false;
>>                if (this._parameter != null && cacheKey._parameter  
>> == null) return false;
>>                if (!this._parameter.Equals(cacheKey._parameter))  
>> return false;
>
> -- 
> This message is automatically generated by JIRA.
> -
> If you think it was sent incorrectly contact one of the  
> administrators:
>    http://issues.apache.org/jira/secure/Administrators.jspa
> -
> For more information on JIRA, see:
>    http://www.atlassian.com/software/jira
>