Bug #43411 Server and falcon gives different results when comparing int to timestamp const
Submitted: 5 Mar 2009 12:57 Modified: 26 May 2010 17:52
Reporter: Lars-Erik Bjørk Email Updates:
Status: Unsupported Impact on me:
None 
Category:MySQL Server: Falcon storage engine Severity:S3 (Non-critical)
Version: OS:Any
Assigned to: Lars-Erik Bjørk CPU Architecture:Any
Tags: F_ENCODING

[5 Mar 2009 12:57] Lars-Erik Bjørk
Description:
When we compare an integer to a timestamp, we get different results if the comparison is done in the storage engine (by using LIMIT), than if the comparison is done in the server (by not using LIMIT).

# 13:24:13 Query: SELECT * FROM `AA` WHERE `int_key` < '2004-01-22 18:08:58' returns different result when executed with predicate 'ORDER BY `int_key` LIMIT 1073741824' (2 vs. 1 rows).
--- /tmp/randgen8207-server0.dump	2009-03-05 13:24:13.000000000 +0100
+++ /tmp/randgen8207-server1.dump	2009-03-05 13:24:13.000000000 +0100
@@ -1,2 +1 @@
-10	0	1	2000-11-15	0000-00-00	00:00:00	00:00:00	2002-03-21 00:00:00	0000-00-00 00:00:00		
 11	0	1	0000-00-00	0000-00-00	00:00:00	00:00:00	2002-05-09 00:00:00	0000-00-00 00:00:00

This is a pretty strange case, though, and quite artificial.

How to repeat:
To reproduce, run the following command, using the falcon_nolimit.yy pasted below:

runall.pl \ 
--basedir=/home/lb200670/devel/mysql/bugfest/ \ 
--mysqld=--loose-innodb-lock-wait-timeout=1 \ 
--mysqld=--table-lock-wait-timeout=1 \ 
--mysqld=--loose-falcon-lock-wait-timeout=1 \ 
--mysqld=--loose-falcon-debug-mask=2 \ 
--mysqld=--skip-safemalloc \ 
--grammar=conf/falcon_nolimit.yy \ 
--threads=1 \ 
--validator=Limit \ 
--reporters=Deadlock,ErrorLog,Backtrace,Recovery,WinPackage,Shutdown \ 
--duration=1200 \ 
--vardir=/tmp/vardir \ 
--mysqld=--log-output=file \ 
--queries=100000 \ 
--engine=falcon

Using the following grammar file:

query:
    select | select | select | select | select |
    select | select | select | select | select |
    select | select | select | select | select |
    dml | dml | dml | dml | dml
    ;

dml:
    update | insert | delete ;

select:
    SELECT * FROM _table where;

where:
    |
    WHERE _field sign value |
#   WHERE _field BETWEEN value AND value |
    WHERE _field IN ( value , value , value , value , value , value ) ;

sign:
    > | < | = | >= | <> | <= | != ;

insert:
    INSERT INTO _table ( _field , _field ) VALUES ( value , value ) ;

update:
    UPDATE _table AS X SET _field = value where ;

delete:
    DELETE FROM _table where LIMIT digit ;

transaction: START TRANSACTION | COMMIT | ROLLBACK ;

alter:
    ALTER ONLINE TABLE _table DROP KEY letter |
    ALTER ONLINE TABLE _table DROP KEY _field |
    ALTER ONLINE TABLE _table ADD KEY letter ( _field ) |
    ALTER ONLINE TABLE _table ADD KEY letter ( _field ) ;

value:
    _english | _digit | _date | _datetime | _time ;

# Use only indexed fields:

_field:
    `int_key` | `date_key` | `datetime_key` | `varchar_key` ;
[13 Mar 2009 18:16] Kevin Lewis
Please re-triage this bug since it is comparing a integer field to a time/date value, which is not normal or useful in a normal database environment.