diff options
author | Alexander Barkov <bar@mariadb.org> | 2015-12-23 14:15:00 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.org> | 2015-12-23 14:15:00 +0400 |
commit | b424420f1028bfc0fdbaf646681950e5b52b9da5 (patch) | |
tree | 696b498cd59dc702cb4cfa02174c42c65b962b8e /sql/field.cc | |
parent | 12b86beac8e395eb9aeada820f83a0737949f937 (diff) | |
download | mariadb-git-b424420f1028bfc0fdbaf646681950e5b52b9da5.tar.gz |
MDEV-9316 Add Field::store_hex_hybrid()
Diffstat (limited to 'sql/field.cc')
-rw-r--r-- | sql/field.cc | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/sql/field.cc b/sql/field.cc index 4d25b4eb060..30678a9fd89 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -1322,6 +1322,31 @@ bool Field::can_optimize_range(const Item_bool_func *cond, } +int Field::store_hex_hybrid(const char *str, uint length) +{ + DBUG_ASSERT(result_type() != STRING_RESULT); + ulonglong nr; + + if (length > 8) + { + nr= flags & UNSIGNED_FLAG ? ULONGLONG_MAX : LONGLONG_MAX; + goto warn; + } + nr= (ulonglong) longlong_from_hex_hybrid(str, length); + if ((length == 8) && !(flags & UNSIGNED_FLAG) && (nr > LONGLONG_MAX)) + { + nr= LONGLONG_MAX; + goto warn; + } + return store((longlong) nr, true); // Assume hex numbers are unsigned + +warn: + if (!store((longlong) nr, true)) + set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); + return 1; +} + + /** Numeric fields base class constructor. */ |