summaryrefslogtreecommitdiff
path: root/sql/item_strfunc.cc
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mnogosearch.org>2013-09-23 18:58:33 +0400
committerAlexander Barkov <bar@mnogosearch.org>2013-09-23 18:58:33 +0400
commite33582d20d2a9f215dc4d0effa55886bbabdce3d (patch)
treeeebea43211dfaefb954c40af5b72afe97019b572 /sql/item_strfunc.cc
parent9cbd53bfb2e72376080a3951185e4780b0519718 (diff)
downloadmariadb-git-e33582d20d2a9f215dc4d0effa55886bbabdce3d.tar.gz
Merging TO_BASE64() and FROM_BASE64() from MySQL-5.6
Diffstat (limited to 'sql/item_strfunc.cc')
-rw-r--r--sql/item_strfunc.cc102
1 files changed, 102 insertions, 0 deletions
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index 6e47cc3c49e..2d2b231fdfe 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -51,6 +51,7 @@
#include "password.h" // my_make_scrambled_password,
// my_make_scrambled_password_323
#include <m_ctype.h>
+#include <base64.h>
#include <my_md5.h>
#include "sha1.h"
#include "my_aes.h"
@@ -451,6 +452,107 @@ void Item_func_aes_decrypt::fix_length_and_dec()
set_persist_maybe_null(1);
}
+
+void Item_func_to_base64::fix_length_and_dec()
+{
+ maybe_null= args[0]->maybe_null;
+ collation.set(default_charset(), DERIVATION_COERCIBLE, MY_REPERTOIRE_ASCII);
+ if (args[0]->max_length > (uint) base64_encode_max_arg_length())
+ {
+ maybe_null= 1;
+ fix_char_length_ulonglong((ulonglong) base64_encode_max_arg_length());
+ }
+ else
+ {
+ int length= base64_needed_encoded_length((int) args[0]->max_length);
+ DBUG_ASSERT(length > 0);
+ fix_char_length_ulonglong((ulonglong) length - 1);
+ }
+}
+
+
+String *Item_func_to_base64::val_str_ascii(String *str)
+{
+ String *res= args[0]->val_str(str);
+ bool too_long= false;
+ int length;
+ if (!res ||
+ res->length() > (uint) base64_encode_max_arg_length() ||
+ (too_long=
+ ((uint) (length= base64_needed_encoded_length((int) res->length())) >
+ current_thd->variables.max_allowed_packet)) ||
+ tmp_value.alloc((uint) length))
+ {
+ null_value= 1; // NULL input, too long input, or OOM.
+ if (too_long)
+ {
+ push_warning_printf(current_thd, Sql_condition::WARN_LEVEL_WARN,
+ ER_WARN_ALLOWED_PACKET_OVERFLOWED,
+ ER(ER_WARN_ALLOWED_PACKET_OVERFLOWED), func_name(),
+ current_thd->variables.max_allowed_packet);
+ }
+ return 0;
+ }
+ base64_encode(res->ptr(), (int) res->length(), (char*) tmp_value.ptr());
+ DBUG_ASSERT(length > 0);
+ tmp_value.length((uint) length - 1); // Without trailing '\0'
+ null_value= 0;
+ return &tmp_value;
+}
+
+
+void Item_func_from_base64::fix_length_and_dec()
+{
+ if (args[0]->max_length > (uint) base64_decode_max_arg_length())
+ {
+ fix_char_length_ulonglong((ulonglong) base64_decode_max_arg_length());
+ }
+ else
+ {
+ int length= base64_needed_decoded_length((int) args[0]->max_length);
+ fix_char_length_ulonglong((ulonglong) length);
+ }
+ maybe_null= 1; // Can be NULL, e.g. in case of badly formed input string
+}
+
+
+String *Item_func_from_base64::val_str(String *str)
+{
+ String *res= args[0]->val_str_ascii(str);
+ bool too_long= false;
+ int length;
+ const char *end_ptr;
+
+ if (!res ||
+ res->length() > (uint) base64_decode_max_arg_length() ||
+ (too_long=
+ ((uint) (length= base64_needed_decoded_length((int) res->length())) >
+ current_thd->variables.max_allowed_packet)) ||
+ tmp_value.alloc((uint) length) ||
+ (length= base64_decode(res->ptr(), (int) res->length(),
+ (char *) tmp_value.ptr(), &end_ptr, 0)) < 0 ||
+ end_ptr < res->ptr() + res->length())
+ {
+ null_value= 1; // NULL input, too long input, OOM, or badly formed input
+ if (too_long)
+ {
+ push_warning_printf(current_thd, Sql_condition::WARN_LEVEL_WARN,
+ ER_WARN_ALLOWED_PACKET_OVERFLOWED,
+ ER(ER_WARN_ALLOWED_PACKET_OVERFLOWED), func_name(),
+ current_thd->variables.max_allowed_packet);
+ }
+ else if (res && length < 0)
+ {
+ push_warning_printf(current_thd, Sql_condition::WARN_LEVEL_WARN,
+ ER_BAD_BASE64_DATA, ER(ER_BAD_BASE64_DATA),
+ end_ptr - res->ptr());
+ }
+ return 0;
+ }
+ tmp_value.length((uint) length);
+ null_value= 0;
+ return &tmp_value;
+}
///////////////////////////////////////////////////////////////////////////////