#At file:///home/lb200670/devel/mysql/trampoline/ based on
revid:john.embretsen@stripped
2916 lars-erik.bjork@stripped 2008-11-24
This is a patch for bug#40614 Falcon datetime indexes can not handle 0000-00-00
After we have found a hit in the index, registered in the bitmap, we
check the actual value of the record to see if it really matches (the
index may be dirty). Further down the stack, in Value::compare, we
compare the stored value (0) to the key value (f. ex
20061212000000). The stored value is represented as a small int,
whereas the key value is an int64. The comparison is done by
subtracting the key value from the stored value, and returning this as
an integer. However, because the special 0 (not NULL) value is much
smaller than the key value, the result will be outside the range of an
int. Therefore, when the int only uses the last 4 bytes of the result,
the sign-bit of the integer will vary depending on the year part of
the datetime value. This fools Value::compare into returning that the
0 datetime-value is greater than a much greater datetime-value for
some values of year. The solution is to compare the numbers without
calculating any intermediate result, returning 1, 0 or -1. I have
taken the liberty to change this for some other comparisons than just
the one failing in this bug.
Modified file 'storage/falcon/Value.cpp'
----------------------------------------
Instead of returning the result of the subtraction as an int, we now
compare the values directly, returning 1, 0 or -1. This way we won't
return the wrong result because we are no longer only taking the last
4 bytes of the value into consideration
This change was made for the places currently using subtraction to
compare.
Added file 'mysql-test/suite/falcon/r/falcon_bug_40614.result'
--------------------------------------------------------------
This is the result file for the test.
Added file 'mysql-test/suite/falcon/t/falcon_bug_40614.test'
------------------------------------------------------------
This is the test that tests the patch. I have tested for plenty of year
values, since this bug did not show for all values.
added:
mysql-test/suite/falcon/r/falcon_bug_40614.result
mysql-test/suite/falcon/t/falcon_bug_40614.test
modified:
storage/falcon/Value.cpp
=== added file 'mysql-test/suite/falcon/r/falcon_bug_40614.result'
--- a/mysql-test/suite/falcon/r/falcon_bug_40614.result 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/falcon/r/falcon_bug_40614.result 2008-11-24 08:56:29 +0000
@@ -0,0 +1,774 @@
+*** Bug #40614 ***
+SET @@storage_engine = 'Falcon';
+DROP TABLE IF EXISTS t1;
+CREATE TABLE t1 (datetime_key datetime, key(datetime_key));
+insert into t1 values ('0000-00-00');
+select * from t1 where datetime_key < '1000-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1901-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1902-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1903-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1904-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1905-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1906-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1907-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1908-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1909-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1910-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1911-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1912-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1913-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1914-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1915-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1916-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1917-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1918-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1919-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1920-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1921-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1922-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1923-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1924-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1925-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1926-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1927-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1928-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1929-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1930-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1931-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1932-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1933-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1934-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1935-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1936-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1937-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1938-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1939-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1940-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1941-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1942-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1943-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1944-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1945-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1946-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1947-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1948-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1949-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1950-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1951-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1952-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1953-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1954-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1955-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1956-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1957-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1958-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1959-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1960-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1961-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1962-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1963-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1964-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1965-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1966-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1967-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1968-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1969-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1970-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1971-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1972-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1973-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1974-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1975-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1976-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1977-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1978-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1979-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1980-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1981-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1982-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1983-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1984-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1985-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1986-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1987-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1988-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1989-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1990-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1991-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1992-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1993-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1994-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1995-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1996-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1997-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1998-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '1999-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2000-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2001-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2002-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2003-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2004-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2005-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2006-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2007-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2008-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2009-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2010-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2011-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2012-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2013-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2014-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2015-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2016-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2017-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2018-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2019-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2020-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2021-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2022-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2023-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2024-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2025-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2026-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2027-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2028-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2029-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2030-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2031-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2032-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2033-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2034-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2035-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2036-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2037-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2038-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2039-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2040-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2041-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2042-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2043-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2044-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2045-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2046-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2047-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2048-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2049-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2050-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2051-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2052-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2053-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2054-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2055-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2056-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2057-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2058-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2059-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2060-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2061-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2062-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2063-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2064-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2065-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2066-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2067-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2068-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2069-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2070-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2071-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2072-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2073-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2074-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2075-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2076-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2077-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2078-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2079-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2080-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2081-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2082-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2083-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2084-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2085-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2086-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2087-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2088-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2089-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2090-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2091-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2092-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2093-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2094-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2095-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2096-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2097-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2098-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2099-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2100-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2101-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2102-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2103-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2104-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2105-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2106-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2107-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2108-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2109-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2110-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2111-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2112-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2113-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2114-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2115-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2116-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2117-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2118-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2119-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2120-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2121-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2122-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2123-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2124-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2125-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2126-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2127-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2128-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2129-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2130-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2131-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2132-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2133-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2134-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2135-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2136-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2137-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2138-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2139-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2140-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2141-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2142-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2143-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2144-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2145-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2146-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2147-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2148-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2149-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2150-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2151-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2152-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2153-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '2154-01-01';
+datetime_key
+0000-00-00 00:00:00
+select * from t1 where datetime_key < '9999-12-31';
+datetime_key
+0000-00-00 00:00:00
+DROP TABLE t1;
=== added file 'mysql-test/suite/falcon/t/falcon_bug_40614.test'
--- a/mysql-test/suite/falcon/t/falcon_bug_40614.test 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/falcon/t/falcon_bug_40614.test 2008-11-24 08:56:29 +0000
@@ -0,0 +1,311 @@
+--source include/have_falcon.inc
+
+#
+# Bug #40614: Falcon datetime indexes can not handle 0000-00-00
+#
+--echo *** Bug #40614 ***
+
+# ----------------------------------------------------- #
+# --- Initialisation --- #
+# ----------------------------------------------------- #
+let $engine = 'Falcon';
+eval SET @@storage_engine = $engine;
+
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+--enable_warnings
+
+# ----------------------------------------------------- #
+# --- Test --- #
+# ----------------------------------------------------- #
+
+CREATE TABLE t1 (datetime_key datetime, key(datetime_key));
+insert into t1 values ('0000-00-00');
+
+# The returned row would vary depending on the year, therefore
+# we are testing for a lot of them.
+#
+# The valid datetime value ranges from '1000-01-01 00:00:00'
+# to '9999-12-31 23:59:59'. This is too many values to test
+# all of them in a simple bug test, but I have included
+# the endpoints as well as the range of the YEAR type.
+# This should be more than sufficient to test for this bug
+# and some more.
+#
+# Pointers to the reference manual are:
+#
+# DATETIME:
+# http://dev.mysql.com/doc/refman/5.1/en/datetime.html
+#
+# YEAR:
+# http://dev.mysql.com/doc/refman/5.1/en/year.html
+#
+
+select * from t1 where datetime_key < '1000-01-01';
+select * from t1 where datetime_key < '1901-01-01';
+select * from t1 where datetime_key < '1902-01-01';
+select * from t1 where datetime_key < '1903-01-01';
+select * from t1 where datetime_key < '1904-01-01';
+select * from t1 where datetime_key < '1905-01-01';
+select * from t1 where datetime_key < '1906-01-01';
+select * from t1 where datetime_key < '1907-01-01';
+select * from t1 where datetime_key < '1908-01-01';
+select * from t1 where datetime_key < '1909-01-01';
+select * from t1 where datetime_key < '1910-01-01';
+select * from t1 where datetime_key < '1911-01-01';
+select * from t1 where datetime_key < '1912-01-01';
+select * from t1 where datetime_key < '1913-01-01';
+select * from t1 where datetime_key < '1914-01-01';
+select * from t1 where datetime_key < '1915-01-01';
+select * from t1 where datetime_key < '1916-01-01';
+select * from t1 where datetime_key < '1917-01-01';
+select * from t1 where datetime_key < '1918-01-01';
+select * from t1 where datetime_key < '1919-01-01';
+select * from t1 where datetime_key < '1920-01-01';
+select * from t1 where datetime_key < '1921-01-01';
+select * from t1 where datetime_key < '1922-01-01';
+select * from t1 where datetime_key < '1923-01-01';
+select * from t1 where datetime_key < '1924-01-01';
+select * from t1 where datetime_key < '1925-01-01';
+select * from t1 where datetime_key < '1926-01-01';
+select * from t1 where datetime_key < '1927-01-01';
+select * from t1 where datetime_key < '1928-01-01';
+select * from t1 where datetime_key < '1929-01-01';
+select * from t1 where datetime_key < '1930-01-01';
+select * from t1 where datetime_key < '1931-01-01';
+select * from t1 where datetime_key < '1932-01-01';
+select * from t1 where datetime_key < '1933-01-01';
+select * from t1 where datetime_key < '1934-01-01';
+select * from t1 where datetime_key < '1935-01-01';
+select * from t1 where datetime_key < '1936-01-01';
+select * from t1 where datetime_key < '1937-01-01';
+select * from t1 where datetime_key < '1938-01-01';
+select * from t1 where datetime_key < '1939-01-01';
+select * from t1 where datetime_key < '1940-01-01';
+select * from t1 where datetime_key < '1941-01-01';
+select * from t1 where datetime_key < '1942-01-01';
+select * from t1 where datetime_key < '1943-01-01';
+select * from t1 where datetime_key < '1944-01-01';
+select * from t1 where datetime_key < '1945-01-01';
+select * from t1 where datetime_key < '1946-01-01';
+select * from t1 where datetime_key < '1947-01-01';
+select * from t1 where datetime_key < '1948-01-01';
+select * from t1 where datetime_key < '1949-01-01';
+select * from t1 where datetime_key < '1950-01-01';
+select * from t1 where datetime_key < '1951-01-01';
+select * from t1 where datetime_key < '1952-01-01';
+select * from t1 where datetime_key < '1953-01-01';
+select * from t1 where datetime_key < '1954-01-01';
+select * from t1 where datetime_key < '1955-01-01';
+select * from t1 where datetime_key < '1956-01-01';
+select * from t1 where datetime_key < '1957-01-01';
+select * from t1 where datetime_key < '1958-01-01';
+select * from t1 where datetime_key < '1959-01-01';
+select * from t1 where datetime_key < '1960-01-01';
+select * from t1 where datetime_key < '1961-01-01';
+select * from t1 where datetime_key < '1962-01-01';
+select * from t1 where datetime_key < '1963-01-01';
+select * from t1 where datetime_key < '1964-01-01';
+select * from t1 where datetime_key < '1965-01-01';
+select * from t1 where datetime_key < '1966-01-01';
+select * from t1 where datetime_key < '1967-01-01';
+select * from t1 where datetime_key < '1968-01-01';
+select * from t1 where datetime_key < '1969-01-01';
+select * from t1 where datetime_key < '1970-01-01';
+select * from t1 where datetime_key < '1971-01-01';
+select * from t1 where datetime_key < '1972-01-01';
+select * from t1 where datetime_key < '1973-01-01';
+select * from t1 where datetime_key < '1974-01-01';
+select * from t1 where datetime_key < '1975-01-01';
+select * from t1 where datetime_key < '1976-01-01';
+select * from t1 where datetime_key < '1977-01-01';
+select * from t1 where datetime_key < '1978-01-01';
+select * from t1 where datetime_key < '1979-01-01';
+select * from t1 where datetime_key < '1980-01-01';
+select * from t1 where datetime_key < '1981-01-01';
+select * from t1 where datetime_key < '1982-01-01';
+select * from t1 where datetime_key < '1983-01-01';
+select * from t1 where datetime_key < '1984-01-01';
+select * from t1 where datetime_key < '1985-01-01';
+select * from t1 where datetime_key < '1986-01-01';
+select * from t1 where datetime_key < '1987-01-01';
+select * from t1 where datetime_key < '1988-01-01';
+select * from t1 where datetime_key < '1989-01-01';
+select * from t1 where datetime_key < '1990-01-01';
+select * from t1 where datetime_key < '1991-01-01';
+select * from t1 where datetime_key < '1992-01-01';
+select * from t1 where datetime_key < '1993-01-01';
+select * from t1 where datetime_key < '1994-01-01';
+select * from t1 where datetime_key < '1995-01-01';
+select * from t1 where datetime_key < '1996-01-01';
+select * from t1 where datetime_key < '1997-01-01';
+select * from t1 where datetime_key < '1998-01-01';
+select * from t1 where datetime_key < '1999-01-01';
+select * from t1 where datetime_key < '2000-01-01';
+select * from t1 where datetime_key < '2001-01-01';
+select * from t1 where datetime_key < '2002-01-01';
+select * from t1 where datetime_key < '2003-01-01';
+select * from t1 where datetime_key < '2004-01-01';
+select * from t1 where datetime_key < '2005-01-01';
+select * from t1 where datetime_key < '2006-01-01';
+select * from t1 where datetime_key < '2007-01-01';
+select * from t1 where datetime_key < '2008-01-01';
+select * from t1 where datetime_key < '2009-01-01';
+select * from t1 where datetime_key < '2010-01-01';
+select * from t1 where datetime_key < '2011-01-01';
+select * from t1 where datetime_key < '2012-01-01';
+select * from t1 where datetime_key < '2013-01-01';
+select * from t1 where datetime_key < '2014-01-01';
+select * from t1 where datetime_key < '2015-01-01';
+select * from t1 where datetime_key < '2016-01-01';
+select * from t1 where datetime_key < '2017-01-01';
+select * from t1 where datetime_key < '2018-01-01';
+select * from t1 where datetime_key < '2019-01-01';
+select * from t1 where datetime_key < '2020-01-01';
+select * from t1 where datetime_key < '2021-01-01';
+select * from t1 where datetime_key < '2022-01-01';
+select * from t1 where datetime_key < '2023-01-01';
+select * from t1 where datetime_key < '2024-01-01';
+select * from t1 where datetime_key < '2025-01-01';
+select * from t1 where datetime_key < '2026-01-01';
+select * from t1 where datetime_key < '2027-01-01';
+select * from t1 where datetime_key < '2028-01-01';
+select * from t1 where datetime_key < '2029-01-01';
+select * from t1 where datetime_key < '2030-01-01';
+select * from t1 where datetime_key < '2031-01-01';
+select * from t1 where datetime_key < '2032-01-01';
+select * from t1 where datetime_key < '2033-01-01';
+select * from t1 where datetime_key < '2034-01-01';
+select * from t1 where datetime_key < '2035-01-01';
+select * from t1 where datetime_key < '2036-01-01';
+select * from t1 where datetime_key < '2037-01-01';
+select * from t1 where datetime_key < '2038-01-01';
+select * from t1 where datetime_key < '2039-01-01';
+select * from t1 where datetime_key < '2040-01-01';
+select * from t1 where datetime_key < '2041-01-01';
+select * from t1 where datetime_key < '2042-01-01';
+select * from t1 where datetime_key < '2043-01-01';
+select * from t1 where datetime_key < '2044-01-01';
+select * from t1 where datetime_key < '2045-01-01';
+select * from t1 where datetime_key < '2046-01-01';
+select * from t1 where datetime_key < '2047-01-01';
+select * from t1 where datetime_key < '2048-01-01';
+select * from t1 where datetime_key < '2049-01-01';
+select * from t1 where datetime_key < '2050-01-01';
+select * from t1 where datetime_key < '2051-01-01';
+select * from t1 where datetime_key < '2052-01-01';
+select * from t1 where datetime_key < '2053-01-01';
+select * from t1 where datetime_key < '2054-01-01';
+select * from t1 where datetime_key < '2055-01-01';
+select * from t1 where datetime_key < '2056-01-01';
+select * from t1 where datetime_key < '2057-01-01';
+select * from t1 where datetime_key < '2058-01-01';
+select * from t1 where datetime_key < '2059-01-01';
+select * from t1 where datetime_key < '2060-01-01';
+select * from t1 where datetime_key < '2061-01-01';
+select * from t1 where datetime_key < '2062-01-01';
+select * from t1 where datetime_key < '2063-01-01';
+select * from t1 where datetime_key < '2064-01-01';
+select * from t1 where datetime_key < '2065-01-01';
+select * from t1 where datetime_key < '2066-01-01';
+select * from t1 where datetime_key < '2067-01-01';
+select * from t1 where datetime_key < '2068-01-01';
+select * from t1 where datetime_key < '2069-01-01';
+select * from t1 where datetime_key < '2070-01-01';
+select * from t1 where datetime_key < '2071-01-01';
+select * from t1 where datetime_key < '2072-01-01';
+select * from t1 where datetime_key < '2073-01-01';
+select * from t1 where datetime_key < '2074-01-01';
+select * from t1 where datetime_key < '2075-01-01';
+select * from t1 where datetime_key < '2076-01-01';
+select * from t1 where datetime_key < '2077-01-01';
+select * from t1 where datetime_key < '2078-01-01';
+select * from t1 where datetime_key < '2079-01-01';
+select * from t1 where datetime_key < '2080-01-01';
+select * from t1 where datetime_key < '2081-01-01';
+select * from t1 where datetime_key < '2082-01-01';
+select * from t1 where datetime_key < '2083-01-01';
+select * from t1 where datetime_key < '2084-01-01';
+select * from t1 where datetime_key < '2085-01-01';
+select * from t1 where datetime_key < '2086-01-01';
+select * from t1 where datetime_key < '2087-01-01';
+select * from t1 where datetime_key < '2088-01-01';
+select * from t1 where datetime_key < '2089-01-01';
+select * from t1 where datetime_key < '2090-01-01';
+select * from t1 where datetime_key < '2091-01-01';
+select * from t1 where datetime_key < '2092-01-01';
+select * from t1 where datetime_key < '2093-01-01';
+select * from t1 where datetime_key < '2094-01-01';
+select * from t1 where datetime_key < '2095-01-01';
+select * from t1 where datetime_key < '2096-01-01';
+select * from t1 where datetime_key < '2097-01-01';
+select * from t1 where datetime_key < '2098-01-01';
+select * from t1 where datetime_key < '2099-01-01';
+select * from t1 where datetime_key < '2100-01-01';
+select * from t1 where datetime_key < '2101-01-01';
+select * from t1 where datetime_key < '2102-01-01';
+select * from t1 where datetime_key < '2103-01-01';
+select * from t1 where datetime_key < '2104-01-01';
+select * from t1 where datetime_key < '2105-01-01';
+select * from t1 where datetime_key < '2106-01-01';
+select * from t1 where datetime_key < '2107-01-01';
+select * from t1 where datetime_key < '2108-01-01';
+select * from t1 where datetime_key < '2109-01-01';
+select * from t1 where datetime_key < '2110-01-01';
+select * from t1 where datetime_key < '2111-01-01';
+select * from t1 where datetime_key < '2112-01-01';
+select * from t1 where datetime_key < '2113-01-01';
+select * from t1 where datetime_key < '2114-01-01';
+select * from t1 where datetime_key < '2115-01-01';
+select * from t1 where datetime_key < '2116-01-01';
+select * from t1 where datetime_key < '2117-01-01';
+select * from t1 where datetime_key < '2118-01-01';
+select * from t1 where datetime_key < '2119-01-01';
+select * from t1 where datetime_key < '2120-01-01';
+select * from t1 where datetime_key < '2121-01-01';
+select * from t1 where datetime_key < '2122-01-01';
+select * from t1 where datetime_key < '2123-01-01';
+select * from t1 where datetime_key < '2124-01-01';
+select * from t1 where datetime_key < '2125-01-01';
+select * from t1 where datetime_key < '2126-01-01';
+select * from t1 where datetime_key < '2127-01-01';
+select * from t1 where datetime_key < '2128-01-01';
+select * from t1 where datetime_key < '2129-01-01';
+select * from t1 where datetime_key < '2130-01-01';
+select * from t1 where datetime_key < '2131-01-01';
+select * from t1 where datetime_key < '2132-01-01';
+select * from t1 where datetime_key < '2133-01-01';
+select * from t1 where datetime_key < '2134-01-01';
+select * from t1 where datetime_key < '2135-01-01';
+select * from t1 where datetime_key < '2136-01-01';
+select * from t1 where datetime_key < '2137-01-01';
+select * from t1 where datetime_key < '2138-01-01';
+select * from t1 where datetime_key < '2139-01-01';
+select * from t1 where datetime_key < '2140-01-01';
+select * from t1 where datetime_key < '2141-01-01';
+select * from t1 where datetime_key < '2142-01-01';
+select * from t1 where datetime_key < '2143-01-01';
+select * from t1 where datetime_key < '2144-01-01';
+select * from t1 where datetime_key < '2145-01-01';
+select * from t1 where datetime_key < '2146-01-01';
+select * from t1 where datetime_key < '2147-01-01';
+select * from t1 where datetime_key < '2148-01-01';
+select * from t1 where datetime_key < '2149-01-01';
+select * from t1 where datetime_key < '2150-01-01';
+select * from t1 where datetime_key < '2151-01-01';
+select * from t1 where datetime_key < '2152-01-01';
+select * from t1 where datetime_key < '2153-01-01';
+select * from t1 where datetime_key < '2154-01-01';
+select * from t1 where datetime_key < '9999-12-31';
+
+
+# ----------------------------------------------------- #
+# --- Check --- #
+# ----------------------------------------------------- #
+
+# Nothing here
+
+# ----------------------------------------------------- #
+# --- Final cleanup --- #
+# ----------------------------------------------------- #
+DROP TABLE t1;
=== modified file 'storage/falcon/Value.cpp'
--- a/storage/falcon/Value.cpp 2008-04-28 20:47:43 +0000
+++ b/storage/falcon/Value.cpp 2008-11-24 08:56:29 +0000
@@ -366,13 +366,25 @@ int Value::compare(Value * value)
if (scale != value->scale)
break;
- return data.smallInt - value->data.smallInt;
+ if (data.smallInt > value->data.smallInt)
+ return 1;
+
+ if (data.smallInt < value->data.smallInt)
+ return -1;
+
+ return 0;
case Int32:
if (scale != value->scale)
break;
- return data.integer - value->data.integer;
+ if (data.integer > value->data.integer)
+ return 1;
+
+ if (data.integer < value->data.integer)
+ return -1;
+
+ return 0;
case Double:
if (data.dbl > value->data.dbl)
@@ -480,15 +492,34 @@ int Value::compare(Value * value)
case Double:
case Float:
- return (int) (getDouble() - value->getDouble());
+ {
+ double v1 = getDouble();
+ double v2 = value->getDouble();
+
+ if (v1 > v2)
+ return 1;
+
+ if (v1 < v2)
+ return -1;
+
+ return 0;
+ }
case Int64:
{
int s1 = getScale();
int s2 = value->getScale();
int maxScale = MAX(s1, s2);
+ int64 v1 = getQuad(maxScale);
+ int64 v2 = value->getQuad(maxScale);
+
+ if (v1 > v2)
+ return 1;
+
+ if (v1 < v2)
+ return -1;
- return (int) (getQuad(maxScale) - value->getQuad(maxScale));
+ return 0;
}
case Short:
@@ -497,8 +528,16 @@ int Value::compare(Value * value)
int s1 = getScale();
int s2 = value->getScale();
int maxScale = MAX(s1, s2);
+ int v1 = getInt(maxScale);
+ int v2 = value->getInt(maxScale);
+
+ if (v1 > v2)
+ return 1;
- return (int) (getInt(maxScale) - value->getInt(maxScale));
+ if (v1 < v2)
+ return -1;
+
+ return 0;
}
case Date: