summaryrefslogtreecommitdiff
path: root/sql/field.cc
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.org>2015-12-23 14:15:00 +0400
committerAlexander Barkov <bar@mariadb.org>2015-12-23 14:15:00 +0400
commitb424420f1028bfc0fdbaf646681950e5b52b9da5 (patch)
tree696b498cd59dc702cb4cfa02174c42c65b962b8e /sql/field.cc
parent12b86beac8e395eb9aeada820f83a0737949f937 (diff)
downloadmariadb-git-b424420f1028bfc0fdbaf646681950e5b52b9da5.tar.gz
MDEV-9316 Add Field::store_hex_hybrid()
Diffstat (limited to 'sql/field.cc')
-rw-r--r--sql/field.cc25
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.
*/