diff options
author | unknown <pekka@mysql.com> | 2005-02-16 21:19:42 +0100 |
---|---|---|
committer | unknown <pekka@mysql.com> | 2005-02-16 21:19:42 +0100 |
commit | fced35f74a0c93fbbea0f1d2a21da13378467caf (patch) | |
tree | 06ae6ab7f0473caedb7bd0dd265bf6995711f3fa /ndb | |
parent | 88f264f0ced1a178117a4286531257acbae0c5c8 (diff) | |
download | mariadb-git-fced35f74a0c93fbbea0f1d2a21da13378467caf.tar.gz |
ndb - fix new decimal type mysql vs. ndb
mysql-test/r/ndb_index_ordered.result:
fix new decimal mysql vs. ndb
mysql-test/t/ndb_index_ordered.test:
fix new decimal mysql vs. ndb
ndb/include/kernel/signaldata/DictTabInfo.hpp:
fix new decimal mysql vs. ndb
ndb/include/ndb_constants.h:
fix new decimal mysql vs. ndb
ndb/include/ndbapi/NdbDictionary.hpp:
fix new decimal mysql vs. ndb
ndb/include/util/NdbSqlUtil.hpp:
fix new decimal mysql vs. ndb
ndb/src/common/util/NdbSqlUtil.cpp:
fix new decimal mysql vs. ndb
ndb/src/ndbapi/NdbDictionary.cpp:
fix new decimal mysql vs. ndb
ndb/src/ndbapi/NdbDictionaryImpl.cpp:
fix new decimal mysql vs. ndb
ndb/src/ndbapi/NdbRecAttr.cpp:
fix new decimal mysql vs. ndb
ndb/test/include/NdbSchemaOp.hpp:
fix new decimal mysql vs. ndb
ndb/test/src/HugoCalculator.cpp:
fix new decimal mysql vs. ndb
ndb/tools/restore/consumer.cpp:
fix new decimal mysql vs. ndb
sql/ha_ndbcluster.cc:
fix new decimal mysql vs. ndb
Diffstat (limited to 'ndb')
-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 |
11 files changed, 102 insertions, 2 deletions
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: |