From ce6de604c899167d930d01f8500bbd81d1f0e24b Mon Sep 17 00:00:00 2001 From: unknown <pekka@mysql.com> Date: Sat, 8 Jan 2005 13:59:57 +0100 Subject: [PATCH] ndb - wl-1442 bug#7725 datetime ordering mysql-test/t/ndb_index_ordered.test: wl-1442 datetime ordering ndb/src/common/util/NdbSqlUtil.cpp: wl-1442 datetime ordering --- mysql-test/t/ndb_index_ordered.test | 29 +++++++++++++++++++++++++++++ ndb/src/common/util/NdbSqlUtil.cpp | 24 ++++++++++-------------- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/mysql-test/t/ndb_index_ordered.test b/mysql-test/t/ndb_index_ordered.test index 53177511bc6..c5d3a83a3ab 100644 --- a/mysql-test/t/ndb_index_ordered.test +++ b/mysql-test/t/ndb_index_ordered.test @@ -172,3 +172,32 @@ SELECT s.SubscrID,l.SbclID FROM test1 s left JOIN test2 l ON l.SbcrID=s.SubscrID WHERE s.UsrID=224 order by 1, 2; drop table test1; drop table test2; + +# bug#7424 + bug#7725 + +create table t1 ( + pk int primary key, + dt datetime not null, + da date not null, + ye year not null, + ti time not null, + ts timestamp not null, + index(dt), + index(da), + index(ye), + index(ti), + index(ts) +) engine=ndb; + +insert into t1 (pk,dt,da,ye,ti) values + (1, '1901-05-05 23:00:59', '1901-05-05', '1901', '23:00:59'), + (2, '1955-12-31 00:00:00', '1955-12-31', '1955', '00:00:00'), + (3, '1999-06-06 06:06:06', '1999-06-06', '1999', '06:06:06'), + (4, '2001-01-01 10:11:11', '2001-01-01', '2001', '10:11:11'), + (5, '2005-01-31 23:59:59', '2005-01-31', '2005', '23:59:59'); + +# datetime +select count(*) from t1 use index (dt) where dt > '1900-01-01 00:00:00'; +select count(*) from t1 use index (dt) where dt > '1955-12-31 00:00:00'; +select count(*) from t1 use index (dt) where dt < '2001-01-01 10:11:11'; +select count(*) from t1 use index (dt) where dt < '2001-01-01 10:11:12'; diff --git a/ndb/src/common/util/NdbSqlUtil.cpp b/ndb/src/common/util/NdbSqlUtil.cpp index 5b2381df50a..8491fa3c4a0 100644 --- a/ndb/src/common/util/NdbSqlUtil.cpp +++ b/ndb/src/common/util/NdbSqlUtil.cpp @@ -469,21 +469,17 @@ int NdbSqlUtil::cmpDatetime(const void* info, const Uint32* p1, const Uint32* p2, Uint32 full, Uint32 size) { assert(full >= size && size > 0); - /* - * Datetime is CC YY MM DD hh mm ss \0 - * - * Not used via MySQL. - */ - union { const Uint32* p; const unsigned char* v; } u1, u2; - u1.p = p1; - u2.p = p2; - // no format check - int k = memcmp(u1.v, u2.v, 4); - if (k != 0) - return k < 0 ? -1 : +1; if (size >= 2) { - k = memcmp(u1.v + 4, u2.v + 4, 4); - return k < 0 ? -1 : k > 0 ? +1 : 0; + union { Uint32 p[2]; Int64 v; } u1, u2; + u1.p[0] = p1[0]; + u1.p[1] = p1[1]; + u2.p[0] = p2[0]; + u2.p[1] = p2[1]; + if (u1.v < u2.v) + return -1; + if (u1.v > u2.v) + return +1; + return 0; } return CmpUnknown; } -- 2.30.9