Commit 0462ccfe authored by pekka@mysql.com's avatar pekka@mysql.com

ndb - wl-1442 fix Date ordering

parent 7ef7580b
...@@ -325,19 +325,53 @@ index(ts) ...@@ -325,19 +325,53 @@ index(ts)
) engine=ndb; ) engine=ndb;
insert into t1 (pk,dt,da,ye,ti) values insert into t1 (pk,dt,da,ye,ti) values
(1, '1901-05-05 23:00:59', '1901-05-05', '1901', '23:00:59'), (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'), (2, '1912-09-05 13:00:59', '1912-09-05', '1912', '13:00:59'),
(3, '1999-06-06 06:06:06', '1999-06-06', '1999', '06:06:06'), (3, '1945-12-31 00:00:00', '1945-12-31', '1945', '00:00:00'),
(4, '2001-01-01 10:11:11', '2001-01-01', '2001', '10:11:11'), (4, '1955-12-31 00:00:00', '1955-12-31', '1955', '00:00:00'),
(5, '2005-01-31 23:59:59', '2005-01-31', '2005', '23:59:59'); (5, '1963-06-06 06:06:06', '1963-06-06', '1963', '06:06:06'),
select count(*) from t1 use index (dt) where dt > '1900-01-01 00:00:00'; (6, '1993-06-06 06:06:06', '1993-06-06', '1993', '06:06:06'),
count(*) (7, '2001-01-01 10:11:10', '2001-01-01', '2001', '10:11:10'),
5 (8, '2001-01-01 10:11:11', '2001-01-01', '2001', '10:11:11'),
select count(*) from t1 use index (dt) where dt > '1955-12-31 00:00:00'; (9, '2005-01-31 23:59:59', '2005-01-31', '2005', '23:59:59');
count(*) select count(*)-9 from t1 use index (dt) where dt > '1900-01-01 00:00:00';
3 count(*)-9
select count(*) from t1 use index (dt) where dt < '2001-01-01 10:11:11'; 0
count(*) select count(*)-6 from t1 use index (dt) where dt >= '1955-12-31 00:00:00';
3 count(*)-6
select count(*) from t1 use index (dt) where dt < '2001-01-01 10:11:12'; 0
count(*) select count(*)-5 from t1 use index (dt) where dt > '1955-12-31 00:00:00';
4 count(*)-5
0
select count(*)-5 from t1 use index (dt) where dt < '1970-03-03 22:22:22';
count(*)-5
0
select count(*)-7 from t1 use index (dt) where dt < '2001-01-01 10:11:11';
count(*)-7
0
select count(*)-8 from t1 use index (dt) where dt <= '2001-01-01 10:11:11';
count(*)-8
0
select count(*)-9 from t1 use index (dt) where dt <= '2055-01-01 00:00:00';
count(*)-9
0
select count(*)-9 from t1 use index (da) where da > '1900-01-01';
count(*)-9
0
select count(*)-6 from t1 use index (da) where da >= '1955-12-31';
count(*)-6
0
select count(*)-5 from t1 use index (da) where da > '1955-12-31';
count(*)-5
0
select count(*)-5 from t1 use index (da) where da < '1970-03-03';
count(*)-5
0
select count(*)-6 from t1 use index (da) where da < '2001-01-01';
count(*)-6
0
select count(*)-8 from t1 use index (da) where da <= '2001-01-02';
count(*)-8
0
select count(*)-9 from t1 use index (da) where da <= '2055-01-01';
count(*)-9
0
...@@ -191,13 +191,29 @@ create table t1 ( ...@@ -191,13 +191,29 @@ create table t1 (
insert into t1 (pk,dt,da,ye,ti) values insert into t1 (pk,dt,da,ye,ti) values
(1, '1901-05-05 23:00:59', '1901-05-05', '1901', '23:00:59'), (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'), (2, '1912-09-05 13:00:59', '1912-09-05', '1912', '13:00:59'),
(3, '1999-06-06 06:06:06', '1999-06-06', '1999', '06:06:06'), (3, '1945-12-31 00:00:00', '1945-12-31', '1945', '00:00:00'),
(4, '2001-01-01 10:11:11', '2001-01-01', '2001', '10:11:11'), (4, '1955-12-31 00:00:00', '1955-12-31', '1955', '00:00:00'),
(5, '2005-01-31 23:59:59', '2005-01-31', '2005', '23:59:59'); (5, '1963-06-06 06:06:06', '1963-06-06', '1963', '06:06:06'),
(6, '1993-06-06 06:06:06', '1993-06-06', '1993', '06:06:06'),
(7, '2001-01-01 10:11:10', '2001-01-01', '2001', '10:11:10'),
(8, '2001-01-01 10:11:11', '2001-01-01', '2001', '10:11:11'),
(9, '2005-01-31 23:59:59', '2005-01-31', '2005', '23:59:59');
# datetime # datetime
select count(*) from t1 use index (dt) where dt > '1900-01-01 00:00:00'; select count(*)-9 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(*)-6 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(*)-5 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:12'; select count(*)-5 from t1 use index (dt) where dt < '1970-03-03 22:22:22';
select count(*)-7 from t1 use index (dt) where dt < '2001-01-01 10:11:11';
select count(*)-8 from t1 use index (dt) where dt <= '2001-01-01 10:11:11';
select count(*)-9 from t1 use index (dt) where dt <= '2055-01-01 00:00:00';
# date
select count(*)-9 from t1 use index (da) where da > '1900-01-01';
select count(*)-6 from t1 use index (da) where da >= '1955-12-31';
select count(*)-5 from t1 use index (da) where da > '1955-12-31';
select count(*)-5 from t1 use index (da) where da < '1970-03-03';
select count(*)-6 from t1 use index (da) where da < '2001-01-01';
select count(*)-8 from t1 use index (da) where da <= '2001-01-02';
select count(*)-9 from t1 use index (da) where da <= '2055-01-01';
...@@ -308,7 +308,7 @@ public: ...@@ -308,7 +308,7 @@ public:
ExtBinary = NdbSqlUtil::Type::Binary, ExtBinary = NdbSqlUtil::Type::Binary,
ExtVarbinary = NdbSqlUtil::Type::Varbinary, ExtVarbinary = NdbSqlUtil::Type::Varbinary,
ExtDatetime = NdbSqlUtil::Type::Datetime, ExtDatetime = NdbSqlUtil::Type::Datetime,
ExtTimespec = NdbSqlUtil::Type::Timespec, ExtDate = NdbSqlUtil::Type::Date,
ExtBlob = NdbSqlUtil::Type::Blob, ExtBlob = NdbSqlUtil::Type::Blob,
ExtText = NdbSqlUtil::Type::Text ExtText = NdbSqlUtil::Type::Text
}; };
...@@ -428,10 +428,10 @@ public: ...@@ -428,10 +428,10 @@ public:
AttributeSize = DictTabInfo::an8Bit; AttributeSize = DictTabInfo::an8Bit;
AttributeArraySize = 8 * AttributeExtLength; AttributeArraySize = 8 * AttributeExtLength;
return true; return true;
case DictTabInfo::ExtTimespec: case DictTabInfo::ExtDate:
AttributeType = DictTabInfo::StringType; AttributeType = DictTabInfo::StringType;
AttributeSize = DictTabInfo::an8Bit; AttributeSize = DictTabInfo::an8Bit;
AttributeArraySize = 12 * AttributeExtLength; AttributeArraySize = 3 * AttributeExtLength;
return true; return true;
case DictTabInfo::ExtBlob: case DictTabInfo::ExtBlob:
case DictTabInfo::ExtText: case DictTabInfo::ExtText:
......
...@@ -185,7 +185,7 @@ public: ...@@ -185,7 +185,7 @@ public:
Binary, ///< Len Binary, ///< Len
Varbinary, ///< Max len Varbinary, ///< Max len
Datetime, ///< Precision down to 1 sec (sizeof(Datetime) == 8 bytes ) Datetime, ///< Precision down to 1 sec (sizeof(Datetime) == 8 bytes )
Timespec, ///< Precision down to 1 nsec(sizeof(Datetime) == 12 bytes ) Date, ///< Precision down to 1 day(sizeof(Date) == 4 bytes )
Blob, ///< Binary large object (see NdbBlob) Blob, ///< Binary large object (see NdbBlob)
Text ///< Text blob Text ///< Text blob
}; };
......
...@@ -81,7 +81,7 @@ public: ...@@ -81,7 +81,7 @@ public:
Binary, // Len Binary, // Len
Varbinary, // Max len Varbinary, // Max len
Datetime, // Precision down to 1 sec (size 8 bytes) Datetime, // Precision down to 1 sec (size 8 bytes)
Timespec, // Precision down to 1 nsec (size 12 bytes) Date, // Precision down to 1 day (size 4 bytes)
Blob, // Blob Blob, // Blob
Text // Text blob Text // Text blob
}; };
...@@ -132,7 +132,7 @@ private: ...@@ -132,7 +132,7 @@ private:
static Cmp cmpBinary; static Cmp cmpBinary;
static Cmp cmpVarbinary; static Cmp cmpVarbinary;
static Cmp cmpDatetime; static Cmp cmpDatetime;
static Cmp cmpTimespec; static Cmp cmpDate;
static Cmp cmpBlob; static Cmp cmpBlob;
static Cmp cmpText; static Cmp cmpText;
}; };
......
...@@ -153,8 +153,8 @@ NdbSqlUtil::m_typeList[] = { ...@@ -153,8 +153,8 @@ NdbSqlUtil::m_typeList[] = {
cmpDatetime cmpDatetime
}, },
{ {
Type::Timespec, Type::Date,
cmpTimespec cmpDate
}, },
{ {
Type::Blob, Type::Blob,
...@@ -485,36 +485,34 @@ NdbSqlUtil::cmpDatetime(const void* info, const Uint32* p1, const Uint32* p2, Ui ...@@ -485,36 +485,34 @@ NdbSqlUtil::cmpDatetime(const void* info, const Uint32* p1, const Uint32* p2, Ui
} }
int int
NdbSqlUtil::cmpTimespec(const void* info, const Uint32* p1, const Uint32* p2, Uint32 full, Uint32 size) NdbSqlUtil::cmpDate(const void* info, const Uint32* p1, const Uint32* p2, Uint32 full, Uint32 size)
{ {
#ifdef ndb_date_is_4_byte_native_int
assert(full >= size && size > 0);
union { Uint32 p[2]; Int32 v; } u1, u2;
u1.p[0] = p1[0];
u2.p[0] = p2[0];
if (u1.v < u2.v)
return -1;
if (u1.v > u2.v)
return +1;
return 0;
#else
assert(full >= size && size > 0); assert(full >= size && size > 0);
/*
* Timespec is CC YY MM DD hh mm ss \0 NN NN NN NN
*
* Not used via MySQL.
*/
union { const Uint32* p; const unsigned char* v; } u1, u2; union { const Uint32* p; const unsigned char* v; } u1, u2;
u1.p = p1; u1.p = p1;
u2.p = p2; u2.p = p2;
// no format check // from Field_newdate::val_int
int k = memcmp(u1.v, u2.v, 4); Uint64 j1 = uint3korr(u1.v);
if (k != 0) Uint64 j2 = uint3korr(u2.v);
return k < 0 ? -1 : +1; j1 = (j1 % 32L)+(j1 / 32L % 16L)*100L + (j1/(16L*32L))*10000L;
if (size >= 2) { j2 = (j2 % 32L)+(j2 / 32L % 16L)*100L + (j2/(16L*32L))*10000L;
k = memcmp(u1.v + 4, u2.v + 4, 4); if (j1 < j2)
if (k != 0) return -1;
return k < 0 ? -1 : +1; if (j1 > j2)
if (size >= 3) { return +1;
Uint32 n1 = *(const Uint32*)(u1.v + 8); return 0;
Uint32 n2 = *(const Uint32*)(u2.v + 8); #endif
if (n1 < n2)
return -1;
if (n2 > n1)
return +1;
return 0;
}
}
return CmpUnknown;
} }
int int
......
...@@ -936,8 +936,8 @@ operator<<(NdbOut& out, const NdbDictionary::Column& col) ...@@ -936,8 +936,8 @@ operator<<(NdbOut& out, const NdbDictionary::Column& col)
case NdbDictionary::Column::Datetime: case NdbDictionary::Column::Datetime:
out << "Datetime"; out << "Datetime";
break; break;
case NdbDictionary::Column::Timespec: case NdbDictionary::Column::Date:
out << "Timespec"; out << "Date";
break; break;
case NdbDictionary::Column::Blob: case NdbDictionary::Column::Blob:
out << "Blob(" << col.getInlineSize() << "," << col.getPartSize() out << "Blob(" << col.getInlineSize() << "," << col.getPartSize()
......
...@@ -130,7 +130,7 @@ NdbColumnImpl::init(Type t) ...@@ -130,7 +130,7 @@ NdbColumnImpl::init(Type t)
case Binary: case Binary:
case Varbinary: case Varbinary:
case Datetime: case Datetime:
case Timespec: case Date:
m_precision = 0; m_precision = 0;
m_scale = 0; m_scale = 0;
m_length = 1; m_length = 1;
...@@ -1174,7 +1174,7 @@ columnTypeMapping[] = { ...@@ -1174,7 +1174,7 @@ columnTypeMapping[] = {
{ DictTabInfo::ExtBinary, NdbDictionary::Column::Binary }, { DictTabInfo::ExtBinary, NdbDictionary::Column::Binary },
{ DictTabInfo::ExtVarbinary, NdbDictionary::Column::Varbinary }, { DictTabInfo::ExtVarbinary, NdbDictionary::Column::Varbinary },
{ DictTabInfo::ExtDatetime, NdbDictionary::Column::Datetime }, { DictTabInfo::ExtDatetime, NdbDictionary::Column::Datetime },
{ DictTabInfo::ExtTimespec, NdbDictionary::Column::Timespec }, { DictTabInfo::ExtDate, NdbDictionary::Column::Date },
{ DictTabInfo::ExtBlob, NdbDictionary::Column::Blob }, { DictTabInfo::ExtBlob, NdbDictionary::Column::Blob },
{ DictTabInfo::ExtText, NdbDictionary::Column::Text }, { DictTabInfo::ExtText, NdbDictionary::Column::Text },
{ -1, -1 } { -1, -1 }
......
...@@ -576,7 +576,7 @@ convertColumnTypeToAttrType(NdbDictionary::Column::Type _type) ...@@ -576,7 +576,7 @@ convertColumnTypeToAttrType(NdbDictionary::Column::Type _type)
case NdbDictionary::Column::Varbinary: case NdbDictionary::Column::Varbinary:
return String; return String;
case NdbDictionary::Column::Datetime: case NdbDictionary::Column::Datetime:
case NdbDictionary::Column::Timespec: case NdbDictionary::Column::Date:
case NdbDictionary::Column::Undefined: case NdbDictionary::Column::Undefined:
default: default:
return NoAttrTypeDef; return NoAttrTypeDef;
......
...@@ -71,8 +71,8 @@ BackupConsumer::create_table_string(const TableS & table, ...@@ -71,8 +71,8 @@ BackupConsumer::create_table_string(const TableS & table,
case NdbDictionary::Column::Datetime: case NdbDictionary::Column::Datetime:
pos += sprintf(buf+pos, "%s", "datetime"); pos += sprintf(buf+pos, "%s", "datetime");
break; break;
case NdbDictionary::Column::Timespec: case NdbDictionary::Column::Date:
pos += sprintf(buf+pos, "%s", "time"); pos += sprintf(buf+pos, "%s", "date");
break; break;
case NdbDictionary::Column::Undefined: case NdbDictionary::Column::Undefined:
// pos += sprintf(buf+pos, "%s", "varchar binary"); // pos += sprintf(buf+pos, "%s", "varchar binary");
......
...@@ -2259,9 +2259,9 @@ void ha_ndbcluster::print_results() ...@@ -2259,9 +2259,9 @@ void ha_ndbcluster::print_results()
fprintf(DBUG_FILE, "Datetime\t%llu", value); fprintf(DBUG_FILE, "Datetime\t%llu", value);
break; break;
} }
case NdbDictionary::Column::Timespec: { case NdbDictionary::Column::Date: {
Uint64 value= (Uint64) *field->ptr; Uint64 value= (Uint64) *field->ptr;
fprintf(DBUG_FILE, "Timespec\t%llu", value); fprintf(DBUG_FILE, "Date\t%llu", value);
break; break;
} }
case NdbDictionary::Column::Blob: { case NdbDictionary::Column::Blob: {
...@@ -3323,8 +3323,11 @@ static int create_ndb_column(NDBCOL &col, ...@@ -3323,8 +3323,11 @@ static int create_ndb_column(NDBCOL &col,
col.setType(NDBCOL::Datetime); col.setType(NDBCOL::Datetime);
col.setLength(1); col.setLength(1);
break; break;
case MYSQL_TYPE_DATE:
case MYSQL_TYPE_NEWDATE: case MYSQL_TYPE_NEWDATE:
col.setType(NDBCOL::Date);
col.setLength(1);
break;
case MYSQL_TYPE_DATE: // ?
case MYSQL_TYPE_TIME: case MYSQL_TYPE_TIME:
case MYSQL_TYPE_YEAR: case MYSQL_TYPE_YEAR:
col.setType(NDBCOL::Char); col.setType(NDBCOL::Char);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment