diff options
-rw-r--r-- | mysql-test/r/ndb_index_ordered.result | 83 | ||||
-rw-r--r-- | mysql-test/t/ndb_index_ordered.test | 96 | ||||
-rw-r--r-- | ndb/include/kernel/signaldata/DictTabInfo.hpp | 37 | ||||
-rw-r--r-- | ndb/include/ndb_constants.h | 4 | ||||
-rw-r--r-- | ndb/include/ndbapi/NdbDictionary.hpp | 2 | ||||
-rw-r--r-- | ndb/include/util/NdbSqlUtil.hpp | 6 | ||||
-rw-r--r-- | ndb/src/common/util/NdbSqlUtil.cpp | 36 | ||||
-rw-r--r-- | ndb/src/ndbapi/NdbDictionary.cpp | 6 | ||||
-rw-r--r-- | ndb/src/ndbapi/NdbDictionaryImpl.cpp | 2 | ||||
-rw-r--r-- | ndb/src/ndbapi/NdbRecAttr.cpp | 5 | ||||
-rw-r--r-- | ndb/test/include/NdbSchemaOp.hpp | 2 | ||||
-rw-r--r-- | ndb/test/src/HugoCalculator.cpp | 2 | ||||
-rw-r--r-- | ndb/tools/restore/consumer.cpp | 2 | ||||
-rw-r--r-- | sql/ha_ndbcluster.cc | 21 |
14 files changed, 253 insertions, 51 deletions
diff --git a/mysql-test/r/ndb_index_ordered.result b/mysql-test/r/ndb_index_ordered.result index 9aa7559d660..212c843cc44 100644 --- a/mysql-test/r/ndb_index_ordered.result +++ b/mysql-test/r/ndb_index_ordered.result @@ -554,6 +554,89 @@ select count(*)-9 from t1 use index (ts) where ts <= '2001-01-01 23:59:59'; count(*)-9 0 drop table t1; +create table t1 ( +a int primary key, +s decimal(12), +t decimal(12, 5), +u decimal(12) unsigned, +v decimal(12, 5) unsigned, +key (s), +key (t), +key (u), +key (v) +) engine=ndb; +insert into t1 values +( 0, -000000000007, -0000061.00003, 000000000061, 0000965.00042), +( 1, -000000000007, -0000061.00042, 000000000061, 0000965.00003), +( 2, -071006035767, 4210253.00024, 000000000001, 0000001.84488), +( 3, 000000007115, 0000000.77607, 000077350625, 0000018.00013), +( 4, -000000068391, -0346486.00000, 000000005071, 0005334.00002), +( 5, -521579890459, -1936874.00001, 000000000154, 0000003.00018), +( 6, -521579890459, -1936874.00018, 000000000154, 0000003.00001), +( 7, 000000000333, 0000051.39140, 000000907958, 0788643.08374), +( 8, 000042731229, 0000009.00000, 000000000009, 6428667.00000), +( 9, -000008159769, 0000918.00004, 000096951421, 7607730.00008); +select count(*)- 5 from t1 use index (s) where s < -000000000007; +count(*)- 5 +0 +select count(*)- 7 from t1 use index (s) where s <= -000000000007; +count(*)- 7 +0 +select count(*)- 2 from t1 use index (s) where s = -000000000007; +count(*)- 2 +0 +select count(*)- 5 from t1 use index (s) where s >= -000000000007; +count(*)- 5 +0 +select count(*)- 3 from t1 use index (s) where s > -000000000007; +count(*)- 3 +0 +select count(*)- 4 from t1 use index (t) where t < -0000061.00003; +count(*)- 4 +0 +select count(*)- 5 from t1 use index (t) where t <= -0000061.00003; +count(*)- 5 +0 +select count(*)- 1 from t1 use index (t) where t = -0000061.00003; +count(*)- 1 +0 +select count(*)- 6 from t1 use index (t) where t >= -0000061.00003; +count(*)- 6 +0 +select count(*)- 5 from t1 use index (t) where t > -0000061.00003; +count(*)- 5 +0 +select count(*)- 2 from t1 use index (u) where u < 000000000061; +count(*)- 2 +0 +select count(*)- 4 from t1 use index (u) where u <= 000000000061; +count(*)- 4 +0 +select count(*)- 2 from t1 use index (u) where u = 000000000061; +count(*)- 2 +0 +select count(*)- 8 from t1 use index (u) where u >= 000000000061; +count(*)- 8 +0 +select count(*)- 6 from t1 use index (u) where u > 000000000061; +count(*)- 6 +0 +select count(*)- 5 from t1 use index (v) where v < 0000965.00042; +count(*)- 5 +0 +select count(*)- 6 from t1 use index (v) where v <= 0000965.00042; +count(*)- 6 +0 +select count(*)- 1 from t1 use index (v) where v = 0000965.00042; +count(*)- 1 +0 +select count(*)- 5 from t1 use index (v) where v >= 0000965.00042; +count(*)- 5 +0 +select count(*)- 4 from t1 use index (v) where v > 0000965.00042; +count(*)- 4 +0 +drop table t1; create table t1(a int primary key, b int not null, index(b)); insert into t1 values (1,1), (2,2); set autocommit=0; diff --git a/mysql-test/t/ndb_index_ordered.test b/mysql-test/t/ndb_index_ordered.test index 1e07ca93c30..2ebf06b78a8 100644 --- a/mysql-test/t/ndb_index_ordered.test +++ b/mysql-test/t/ndb_index_ordered.test @@ -282,55 +282,55 @@ drop table t1; # decimal (not the new 5.0 thing) -#create table t1 ( -# a int primary key, -# s decimal(12), -# t decimal(12, 5), -# u decimal(12) unsigned, -# v decimal(12, 5) unsigned, -# key (s), -# key (t), -# key (u), -# key (v) -#) engine=ndb; -## -#insert into t1 values -# ( 0, -000000000007, -0000061.00003, 000000000061, 0000965.00042), -# ( 1, -000000000007, -0000061.00042, 000000000061, 0000965.00003), -# ( 2, -071006035767, 4210253.00024, 000000000001, 0000001.84488), -# ( 3, 000000007115, 0000000.77607, 000077350625, 0000018.00013), -# ( 4, -000000068391, -0346486.00000, 000000005071, 0005334.00002), -# ( 5, -521579890459, -1936874.00001, 000000000154, 0000003.00018), -# ( 6, -521579890459, -1936874.00018, 000000000154, 0000003.00001), -# ( 7, 000000000333, 0000051.39140, 000000907958, 0788643.08374), -# ( 8, 000042731229, 0000009.00000, 000000000009, 6428667.00000), -# ( 9, -000008159769, 0000918.00004, 000096951421, 7607730.00008); -## -#select count(*)- 5 from t1 use index (s) where s < -000000000007; -#select count(*)- 7 from t1 use index (s) where s <= -000000000007; -#select count(*)- 2 from t1 use index (s) where s = -000000000007; -#select count(*)- 5 from t1 use index (s) where s >= -000000000007; -#select count(*)- 3 from t1 use index (s) where s > -000000000007; -## -#select count(*)- 4 from t1 use index (t) where t < -0000061.00003; -#select count(*)- 5 from t1 use index (t) where t <= -0000061.00003; -#select count(*)- 1 from t1 use index (t) where t = -0000061.00003; -#select count(*)- 6 from t1 use index (t) where t >= -0000061.00003; -#select count(*)- 5 from t1 use index (t) where t > -0000061.00003; -## -#select count(*)- 2 from t1 use index (u) where u < 000000000061; -#select count(*)- 4 from t1 use index (u) where u <= 000000000061; -#select count(*)- 2 from t1 use index (u) where u = 000000000061; -#select count(*)- 8 from t1 use index (u) where u >= 000000000061; -#select count(*)- 6 from t1 use index (u) where u > 000000000061; -## -#select count(*)- 5 from t1 use index (v) where v < 0000965.00042; -#select count(*)- 6 from t1 use index (v) where v <= 0000965.00042; -#select count(*)- 1 from t1 use index (v) where v = 0000965.00042; -#select count(*)- 5 from t1 use index (v) where v >= 0000965.00042; -#select count(*)- 4 from t1 use index (v) where v > 0000965.00042; +create table t1 ( + a int primary key, + s decimal(12), + t decimal(12, 5), + u decimal(12) unsigned, + v decimal(12, 5) unsigned, + key (s), + key (t), + key (u), + key (v) +) engine=ndb; +# +insert into t1 values + ( 0, -000000000007, -0000061.00003, 000000000061, 0000965.00042), + ( 1, -000000000007, -0000061.00042, 000000000061, 0000965.00003), + ( 2, -071006035767, 4210253.00024, 000000000001, 0000001.84488), + ( 3, 000000007115, 0000000.77607, 000077350625, 0000018.00013), + ( 4, -000000068391, -0346486.00000, 000000005071, 0005334.00002), + ( 5, -521579890459, -1936874.00001, 000000000154, 0000003.00018), + ( 6, -521579890459, -1936874.00018, 000000000154, 0000003.00001), + ( 7, 000000000333, 0000051.39140, 000000907958, 0788643.08374), + ( 8, 000042731229, 0000009.00000, 000000000009, 6428667.00000), + ( 9, -000008159769, 0000918.00004, 000096951421, 7607730.00008); +# +select count(*)- 5 from t1 use index (s) where s < -000000000007; +select count(*)- 7 from t1 use index (s) where s <= -000000000007; +select count(*)- 2 from t1 use index (s) where s = -000000000007; +select count(*)- 5 from t1 use index (s) where s >= -000000000007; +select count(*)- 3 from t1 use index (s) where s > -000000000007; # -#drop table t1; +select count(*)- 4 from t1 use index (t) where t < -0000061.00003; +select count(*)- 5 from t1 use index (t) where t <= -0000061.00003; +select count(*)- 1 from t1 use index (t) where t = -0000061.00003; +select count(*)- 6 from t1 use index (t) where t >= -0000061.00003; +select count(*)- 5 from t1 use index (t) where t > -0000061.00003; +# +select count(*)- 2 from t1 use index (u) where u < 000000000061; +select count(*)- 4 from t1 use index (u) where u <= 000000000061; +select count(*)- 2 from t1 use index (u) where u = 000000000061; +select count(*)- 8 from t1 use index (u) where u >= 000000000061; +select count(*)- 6 from t1 use index (u) where u > 000000000061; +# +select count(*)- 5 from t1 use index (v) where v < 0000965.00042; +select count(*)- 6 from t1 use index (v) where v <= 0000965.00042; +select count(*)- 1 from t1 use index (v) where v = 0000965.00042; +select count(*)- 5 from t1 use index (v) where v >= 0000965.00042; +select count(*)- 4 from t1 use index (v) where v > 0000965.00042; + +drop table t1; # bug#7798 create table t1(a int primary key, b int not null, index(b)); diff --git a/ndb/include/kernel/signaldata/DictTabInfo.hpp b/ndb/include/kernel/signaldata/DictTabInfo.hpp index 23926374dd6..09b00cf8993 100644 --- a/ndb/include/kernel/signaldata/DictTabInfo.hpp +++ b/ndb/include/kernel/signaldata/DictTabInfo.hpp @@ -24,6 +24,28 @@ #include <trigger_definitions.h> #include <NdbSqlUtil.hpp> +#ifndef my_decimal_h + +// sql/my_decimal.h requires many more sql/*.h new to ndb +// for now, copy the bit we need TODO proper fix + +#define DECIMAL_MAX_LENGTH ((8 * 9) - 8) + +#ifndef NOT_FIXED_DEC +#define NOT_FIXED_DEC 31 +#endif + +C_MODE_START +extern int decimal_bin_size(int, int); +C_MODE_END + +inline int my_decimal_get_binary_size(uint precision, uint scale) +{ + return decimal_bin_size((int)precision, (int)scale); +} + +#endif + #define DTIMAP(x, y, z) \ { DictTabInfo::y, offsetof(x, z), SimpleProperties::Uint32Value, 0, (~0), 0 } @@ -266,6 +288,8 @@ public: ExtDouble = NdbSqlUtil::Type::Double, ExtOlddecimal = NdbSqlUtil::Type::Olddecimal, ExtOlddecimalunsigned = NdbSqlUtil::Type::Olddecimalunsigned, + ExtDecimal = NdbSqlUtil::Type::Decimal, + ExtDecimalunsigned = NdbSqlUtil::Type::Decimalunsigned, ExtChar = NdbSqlUtil::Type::Char, ExtVarchar = NdbSqlUtil::Type::Varchar, ExtBinary = NdbSqlUtil::Type::Binary, @@ -358,6 +382,19 @@ public: (0 + AttributeExtPrecision + (int(AttributeExtScale) > 0)) * AttributeExtLength; break; + case DictTabInfo::ExtDecimal: + case DictTabInfo::ExtDecimalunsigned: + { + // copy from Field_new_decimal ctor + uint precision = AttributeExtPrecision; + uint scale = AttributeExtScale; + if (precision > DECIMAL_MAX_LENGTH || scale >= NOT_FIXED_DEC) + precision = DECIMAL_MAX_LENGTH; + uint bin_size = my_decimal_get_binary_size(precision, scale); + AttributeSize = DictTabInfo::an8Bit; + AttributeArraySize = bin_size * AttributeExtLength; + } + break; case DictTabInfo::ExtChar: case DictTabInfo::ExtBinary: AttributeSize = DictTabInfo::an8Bit; diff --git a/ndb/include/ndb_constants.h b/ndb/include/ndb_constants.h index 36d7ec95b3e..c7c15063cc5 100644 --- a/ndb/include/ndb_constants.h +++ b/ndb/include/ndb_constants.h @@ -64,7 +64,9 @@ #define NDB_TYPE_YEAR 26 #define NDB_TYPE_TIMESTAMP 27 #define NDB_TYPE_OLDDECIMALUNSIGNED 28 +#define NDB_TYPE_DECIMAL 29 +#define NDB_TYPE_DECIMALUNSIGNED 30 -#define NDB_TYPE_MAX 29 +#define NDB_TYPE_MAX 31 #endif diff --git a/ndb/include/ndbapi/NdbDictionary.hpp b/ndb/include/ndbapi/NdbDictionary.hpp index 26f0e71b25c..44851b70958 100644 --- a/ndb/include/ndbapi/NdbDictionary.hpp +++ b/ndb/include/ndbapi/NdbDictionary.hpp @@ -186,6 +186,8 @@ public: Double = NDB_TYPE_DOUBLE, ///< 64-bit float. 8 byte float, can be used in array Olddecimal = NDB_TYPE_OLDDECIMAL, ///< MySQL < 5.0 signed decimal, Precision, Scale Olddecimalunsigned = NDB_TYPE_OLDDECIMALUNSIGNED, + Decimal = NDB_TYPE_DECIMAL, ///< MySQL >= 5.0 signed decimal, Precision, Scale + Decimalunsigned = NDB_TYPE_DECIMALUNSIGNED, Char = NDB_TYPE_CHAR, ///< Len. A fixed array of 1-byte chars Varchar = NDB_TYPE_VARCHAR, ///< Length bytes: 1, Max: 255 Binary = NDB_TYPE_BINARY, ///< Len diff --git a/ndb/include/util/NdbSqlUtil.hpp b/ndb/include/util/NdbSqlUtil.hpp index 8cf1d166aa9..41e4dadfd60 100644 --- a/ndb/include/util/NdbSqlUtil.hpp +++ b/ndb/include/util/NdbSqlUtil.hpp @@ -95,7 +95,9 @@ public: Time = NDB_TYPE_TIME, Year = NDB_TYPE_YEAR, Timestamp = NDB_TYPE_TIMESTAMP, - Olddecimalunsigned = NDB_TYPE_OLDDECIMALUNSIGNED + Olddecimalunsigned = NDB_TYPE_OLDDECIMALUNSIGNED, + Decimal = NDB_TYPE_DECIMAL, + Decimalunsigned = NDB_TYPE_DECIMALUNSIGNED }; Enum m_typeId; // redundant Cmp* m_cmp; // comparison method @@ -172,6 +174,8 @@ private: static Cmp cmpYear; static Cmp cmpTimestamp; static Cmp cmpOlddecimalunsigned; + static Cmp cmpDecimal; + static Cmp cmpDecimalunsigned; }; #endif diff --git a/ndb/src/common/util/NdbSqlUtil.cpp b/ndb/src/common/util/NdbSqlUtil.cpp index 2686ad5c05f..7ecfb5194b8 100644 --- a/ndb/src/common/util/NdbSqlUtil.cpp +++ b/ndb/src/common/util/NdbSqlUtil.cpp @@ -192,6 +192,14 @@ NdbSqlUtil::m_typeList[] = { { // 28 Type::Olddecimalunsigned, cmpOlddecimalunsigned + }, + { // 29 + Type::Decimal, + cmpDecimal + }, + { // 30 + Type::Decimalunsigned, + cmpDecimalunsigned } }; @@ -484,6 +492,34 @@ NdbSqlUtil::cmpOlddecimalunsigned(const void* info, const void* p1, unsigned n1, } int +NdbSqlUtil::cmpDecimal(const void* info, const void* p1, unsigned n1, const void* p2, unsigned n2, bool full) +{ + const uchar* v1 = (const uchar*)p1; + const uchar* v2 = (const uchar*)p2; + // compare as binary strings + unsigned n = (n1 <= n2 ? n1 : n2); + int k = memcmp(v1, v2, n); + if (k == 0) { + k = (full ? n1 : n) - n2; + } + return k < 0 ? -1 : k > 0 ? +1 : full ? 0 : CmpUnknown; +} + +int +NdbSqlUtil::cmpDecimalunsigned(const void* info, const void* p1, unsigned n1, const void* p2, unsigned n2, bool full) +{ + const uchar* v1 = (const uchar*)p1; + const uchar* v2 = (const uchar*)p2; + // compare as binary strings + unsigned n = (n1 <= n2 ? n1 : n2); + int k = memcmp(v1, v2, n); + if (k == 0) { + k = (full ? n1 : n) - n2; + } + return k < 0 ? -1 : k > 0 ? +1 : full ? 0 : CmpUnknown; +} + +int NdbSqlUtil::cmpChar(const void* info, const void* p1, unsigned n1, const void* p2, unsigned n2, bool full) { // collation does not work on prefix for some charsets diff --git a/ndb/src/ndbapi/NdbDictionary.cpp b/ndb/src/ndbapi/NdbDictionary.cpp index aee0b455b28..664d568aee0 100644 --- a/ndb/src/ndbapi/NdbDictionary.cpp +++ b/ndb/src/ndbapi/NdbDictionary.cpp @@ -954,6 +954,12 @@ operator<<(NdbOut& out, const NdbDictionary::Column& col) case NdbDictionary::Column::Olddecimalunsigned: out << "Olddecimalunsigned(" << col.getPrecision() << "," << col.getScale() << ")"; break; + case NdbDictionary::Column::Decimal: + out << "Decimal(" << col.getPrecision() << "," << col.getScale() << ")"; + break; + case NdbDictionary::Column::Decimalunsigned: + out << "Decimalunsigned(" << col.getPrecision() << "," << col.getScale() << ")"; + break; case NdbDictionary::Column::Char: out << "Char(" << col.getLength() << ";" << csname << ")"; break; diff --git a/ndb/src/ndbapi/NdbDictionaryImpl.cpp b/ndb/src/ndbapi/NdbDictionaryImpl.cpp index c50a73c1069..8c3f238404f 100644 --- a/ndb/src/ndbapi/NdbDictionaryImpl.cpp +++ b/ndb/src/ndbapi/NdbDictionaryImpl.cpp @@ -111,6 +111,8 @@ NdbColumnImpl::init(Type t) break; case Olddecimal: case Olddecimalunsigned: + case Decimal: + case Decimalunsigned: m_precision = 10; m_scale = 0; m_length = 1; diff --git a/ndb/src/ndbapi/NdbRecAttr.cpp b/ndb/src/ndbapi/NdbRecAttr.cpp index 51ae14653eb..86a777e79d2 100644 --- a/ndb/src/ndbapi/NdbRecAttr.cpp +++ b/ndb/src/ndbapi/NdbRecAttr.cpp @@ -250,6 +250,10 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r) out.print("%.*s", len, r.aRef()); } break; + case NdbDictionary::Column::Decimal: + case NdbDictionary::Column::Decimalunsigned: + goto unknown; // TODO + break; // for dates cut-and-paste from field.cc case NdbDictionary::Column::Datetime: { @@ -359,6 +363,7 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r) j = length; } break; + unknown: default: /* no print functions for the rest, just print type */ out << (int) r.getType(); j = length; diff --git a/ndb/test/include/NdbSchemaOp.hpp b/ndb/test/include/NdbSchemaOp.hpp index e8ab542b00a..da55f5f9aa5 100644 --- a/ndb/test/include/NdbSchemaOp.hpp +++ b/ndb/test/include/NdbSchemaOp.hpp @@ -569,6 +569,8 @@ convertColumnTypeToAttrType(NdbDictionary::Column::Type _type) case NdbDictionary::Column::Float: case NdbDictionary::Column::Olddecimal: case NdbDictionary::Column::Olddecimalunsigned: + case NdbDictionary::Column::Decimal: + case NdbDictionary::Column::Decimalunsigned: case NdbDictionary::Column::Double: return Float; case NdbDictionary::Column::Char: diff --git a/ndb/test/src/HugoCalculator.cpp b/ndb/test/src/HugoCalculator.cpp index 0a5b9c342c8..8e01f6442bb 100644 --- a/ndb/test/src/HugoCalculator.cpp +++ b/ndb/test/src/HugoCalculator.cpp @@ -147,6 +147,8 @@ HugoCalculator::calcValue(int record, case NdbDictionary::Column::Double: case NdbDictionary::Column::Olddecimal: case NdbDictionary::Column::Olddecimalunsigned: + case NdbDictionary::Column::Decimal: + case NdbDictionary::Column::Decimalunsigned: case NdbDictionary::Column::Binary: case NdbDictionary::Column::Datetime: case NdbDictionary::Column::Time: diff --git a/ndb/tools/restore/consumer.cpp b/ndb/tools/restore/consumer.cpp index ecbdbbf8f4e..b130c4998d5 100644 --- a/ndb/tools/restore/consumer.cpp +++ b/ndb/tools/restore/consumer.cpp @@ -45,9 +45,11 @@ BackupConsumer::create_table_string(const TableS & table, pos += sprintf(buf+pos, "%s", "float"); break; case NdbDictionary::Column::Olddecimal: + case NdbDictionary::Column::Decimal: pos += sprintf(buf+pos, "%s", "decimal"); break; case NdbDictionary::Column::Olddecimalunsigned: + case NdbDictionary::Column::Decimalunsigned: pos += sprintf(buf+pos, "%s", "decimal unsigned"); break; case NdbDictionary::Column::Char: diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index 58a34e21f5f..f62a65cb109 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -446,7 +446,6 @@ bool ha_ndbcluster::get_error_message(int error, static inline bool ndb_supported_type(enum_field_types type) { switch (type) { - case MYSQL_TYPE_DECIMAL: case MYSQL_TYPE_TINY: case MYSQL_TYPE_SHORT: case MYSQL_TYPE_LONG: @@ -454,6 +453,8 @@ static inline bool ndb_supported_type(enum_field_types type) case MYSQL_TYPE_LONGLONG: case MYSQL_TYPE_FLOAT: case MYSQL_TYPE_DOUBLE: + case MYSQL_TYPE_DECIMAL: + case MYSQL_TYPE_NEWDECIMAL: case MYSQL_TYPE_TIMESTAMP: case MYSQL_TYPE_DATETIME: case MYSQL_TYPE_DATE: @@ -3493,6 +3494,24 @@ static int create_ndb_column(NDBCOL &col, col.setLength(1); } break; + case MYSQL_TYPE_NEWDECIMAL: + { + Field_new_decimal *f= (Field_new_decimal*)field; + uint precision= f->field_length; + uint scale= f->decimals(); + if (field->flags & UNSIGNED_FLAG) + { + col.setType(NDBCOL::Decimalunsigned); + } + else + { + col.setType(NDBCOL::Decimal); + } + col.setPrecision(precision); + col.setScale(scale); + col.setLength(1); + } + break; // Date types case MYSQL_TYPE_DATETIME: col.setType(NDBCOL::Datetime); |