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