Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
e33582d2
Commit
e33582d2
authored
Sep 23, 2013
by
Alexander Barkov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Merging TO_BASE64() and FROM_BASE64() from MySQL-5.6
parent
9cbd53bf
Changes
12
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
2103 additions
and
110 deletions
+2103
-110
include/base64.h
include/base64.h
+14
-1
mysql-test/r/func_str.result
mysql-test/r/func_str.result
+1546
-0
mysql-test/suite/binlog/r/binlog_base64_flag.result
mysql-test/suite/binlog/r/binlog_base64_flag.result
+3
-2
mysql-test/suite/binlog/t/binlog_base64_flag.test
mysql-test/suite/binlog/t/binlog_base64_flag.test
+3
-2
mysql-test/t/func_str.test
mysql-test/t/func_str.test
+115
-0
mysys/base64.c
mysys/base64.c
+247
-103
sql/item_create.cc
sql/item_create.cc
+47
-0
sql/item_strfunc.cc
sql/item_strfunc.cc
+102
-0
sql/item_strfunc.h
sql/item_strfunc.h
+21
-0
sql/share/errmsg-utf8.txt
sql/share/errmsg-utf8.txt
+2
-0
sql/sql_binlog.cc
sql/sql_binlog.cc
+2
-1
unittest/mysys/base64-t.c
unittest/mysys/base64-t.c
+1
-1
No files found.
include/base64.h
View file @
e33582d2
...
...
@@ -26,11 +26,21 @@ extern "C" {
*/
int
base64_needed_encoded_length
(
int
length_of_data
);
/*
Maximum length base64_encode_needed_length() can accept with no overflow.
*/
int
base64_encode_max_arg_length
(
void
);
/*
Calculate how much memory needed for dst of base64_decode()
*/
int
base64_needed_decoded_length
(
int
length_of_encoded_data
);
/*
Maximum length base64_decode_needed_length() can accept with no overflow.
*/
int
base64_decode_max_arg_length
();
/*
Encode data as a base64 string
*/
...
...
@@ -40,7 +50,10 @@ int base64_encode(const void *src, size_t src_len, char *dst);
Decode a base64 string into data
*/
int
base64_decode
(
const
char
*
src
,
size_t
src_len
,
void
*
dst
,
const
char
**
end_ptr
);
void
*
dst
,
const
char
**
end_ptr
,
int
flags
);
/* Allow multuple chunks 'AAA= AA== AA==', binlog uses this */
#define MY_BASE64_DECODE_ALLOW_MULTIPLE_CHUNKS 1
#ifdef __cplusplus
...
...
mysql-test/r/func_str.result
View file @
e33582d2
This diff is collapsed.
Click to expand it.
mysql-test/suite/binlog/r/binlog_base64_flag.result
View file @
e33582d2
...
...
@@ -103,7 +103,8 @@ call mtr.add_suppression("Slave SQL.*Column 1 of table .test.char128_utf8. canno
BINLOG '';
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use
BINLOG '123';
ERROR HY000: Decoding of base64 string failed
BINLOG '-2079193929';
ERROR
42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use
ERROR
HY000: Decoding of base64 string failed
BINLOG 'xç↓%~∙D╒ƒ╡';
ERROR
42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use
ERROR
HY000: Decoding of base64 string failed
mysql-test/suite/binlog/t/binlog_base64_flag.test
View file @
e33582d2
...
...
@@ -161,8 +161,9 @@ call mtr.add_suppression("Slave SQL.*Column 1 of table .test.char128_utf8. canno
--
echo
#
--
error
ER_SYNTAX_ERROR
BINLOG
''
;
--
error
ER_BASE64_DECODE_ERROR
BINLOG
'123'
;
--
error
ER_
SYNTAX
_ERROR
--
error
ER_
BASE64_DECODE
_ERROR
BINLOG
'-2079193929'
;
--
error
ER_
SYNTAX
_ERROR
--
error
ER_
BASE64_DECODE
_ERROR
BINLOG
'xç↓%~∙D╒ƒ╡'
;
mysql-test/t/func_str.test
View file @
e33582d2
...
...
@@ -1559,3 +1559,118 @@ drop table t1,t2;
--
echo
# End of 5.5 tests
--
echo
#
--
echo
#
--
echo
# Start of 5.6 tests
--
echo
#
--
echo
#
--
echo
# WL#5510 Functions to_base64 and from_base64
--
echo
#
let
$
1
=
64
;
while
(
$
1
)
{
dec
$
1
;
eval
CREATE
TABLE
t1
AS
SELECT
TO_BASE64
(
REPEAT
(
'a'
,
$
1
))
AS
to_base64
;
SHOW
CREATE
TABLE
t1
;
SELECT
to_base64
,
LENGTH
(
to_base64
)
FROM
t1
;
CREATE
TABLE
t2
AS
SELECT
from_base64
(
to_base64
)
AS
from_base64
FROM
t1
;
SHOW
CREATE
TABLE
t2
;
SELECT
from_base64
,
LENGTH
(
from_base64
)
FROM
t2
;
DROP
TABLE
t2
;
DROP
TABLE
t1
;
--
echo
}
CREATE
TABLE
t1
(
a
VARBINARY
(
64
));
INSERT
INTO
t1
VALUES
(
0x00
),
(
0x0000
),
(
0x000000
),
(
0x00000000
);
INSERT
INTO
t1
VALUES
(
0x00010203040506070809
);
SELECT
TO_BASE64
(
a
),
hex
(
a
)
FROM
t1
ORDER
BY
a
;
DROP
TABLE
t1
;
--
echo
#
--
echo
# Test NULL output for NULL input
--
echo
#
SELECT
TO_BASE64
(
NULL
);
SELECT
FROM_BASE64
(
NULL
);
--
echo
#
--
echo
# RFC4648 test vectors
--
echo
#
SELECT
@
b
:=
TO_BASE64
(
''
),
FROM_BASE64
(
@
b
);
# ""
SELECT
@
b
:=
TO_BASE64
(
'f'
),
FROM_BASE64
(
@
b
);
# "Zg=="
SELECT
@
b
:=
TO_BASE64
(
'fo'
),
FROM_BASE64
(
@
b
);
# "Zm8="
SELECT
@
b
:=
TO_BASE64
(
'foo'
),
FROM_BASE64
(
@
b
);
# "Zm9v"
SELECT
@
b
:=
TO_BASE64
(
'foob'
),
FROM_BASE64
(
@
b
);
# "Zm9vYg=="
SELECT
@
b
:=
TO_BASE64
(
'fooba'
),
FROM_BASE64
(
@
b
);
# "Zm9vYmE="
SELECT
@
b
:=
TO_BASE64
(
'foobar'
),
FROM_BASE64
(
@
b
);
# "Zm9vYmFy"
--
echo
#
--
echo
# Invalid characters - return NULL
--
echo
#
SELECT
hex
(
FROM_BASE64
(
'#'
));
SELECT
hex
(
FROM_BASE64
(
'A#'
));
SELECT
hex
(
FROM_BASE64
(
'AB#'
));
SELECT
hex
(
FROM_BASE64
(
'ABC#'
));
SELECT
hex
(
FROM_BASE64
(
'ABCD#'
));
--
echo
#
--
echo
# "=" is not valid on the first and second positions of a quadruple
--
echo
#
SELECT
hex
(
FROM_BASE64
(
'='
));
SELECT
hex
(
FROM_BASE64
(
'A='
));
SELECT
hex
(
FROM_BASE64
(
'ABCD='
));
SELECT
hex
(
FROM_BASE64
(
'ABCDE='
));
--
echo
#
--
echo
# Incomplete sequences - return NULL
--
echo
#
SELECT
hex
(
FROM_BASE64
(
'A'
));
SELECT
hex
(
FROM_BASE64
(
'AB'
));
SELECT
hex
(
FROM_BASE64
(
'ABC'
));
--
echo
#
--
echo
# Unexpected input after pad characters - return NULL
--
echo
#
SELECT
hex
(
FROM_BASE64
(
'AAA=x'
));
SELECT
hex
(
FROM_BASE64
(
'AA==x'
));
--
echo
#
--
echo
# Delimiters are allowed at any position
--
echo
#
SELECT
hex
(
FROM_BASE64
(
' A B C D '
));
SELECT
hex
(
FROM_BASE64
(
' A A = = '
));
SELECT
hex
(
FROM_BASE64
(
' A A A = '
));
SELECT
hex
(
FROM_BASE64
(
' A \n B \r C \t D '
));
--
echo
#
--
echo
# Testing that to_base64 respects max_allowed_packet
--
echo
#
SELECT
LENGTH
(
TO_BASE64
(
REPEAT
(
'a'
,
@@
max_allowed_packet
-
10
)));
--
echo
#
--
echo
# Testing base64 with various data types
--
echo
#
CREATE
TABLE
t1
(
i1
INT
,
f1
FLOAT
,
dc1
DECIMAL
(
10
,
5
),
e1
ENUM
(
'enum11'
,
'enum12'
,
'enum13'
),
s1
SET
(
'set1'
,
'set2'
,
'set3'
),
t1
TIME
,
d1
DATE
,
dt1
DATETIME
);
INSERT
INTO
t1
VALUES
(
-
12345
,
-
456.789
,
123.45
,
'enum13'
,
'set1,set3'
,
'01:02:03'
,
'2010-01-01'
,
'2011-01-01 02:03:04'
);
SELECT
FROM_BASE64
(
TO_BASE64
(
i1
))
FROM
t1
;
SELECT
FROM_BASE64
(
TO_BASE64
(
f1
))
FROM
t1
;
SELECT
FROM_BASE64
(
TO_BASE64
(
dc1
))
FROM
t1
;
SELECT
FROM_BASE64
(
TO_BASE64
(
e1
))
FROM
t1
;
SELECT
FROM_BASE64
(
TO_BASE64
(
s1
))
FROM
t1
;
SELECT
FROM_BASE64
(
TO_BASE64
(
t1
))
FROM
t1
;
SELECT
FROM_BASE64
(
TO_BASE64
(
d1
))
FROM
t1
;
SELECT
FROM_BASE64
(
TO_BASE64
(
dt1
))
FROM
t1
;
DROP
TABLE
t1
;
mysys/base64.c
View file @
e33582d2
This diff is collapsed.
Click to expand it.
sql/item_create.cc
View file @
e33582d2
...
...
@@ -1151,6 +1151,19 @@ class Create_func_found_rows : public Create_func_arg0
};
class
Create_func_from_base64
:
public
Create_func_arg1
{
public:
virtual
Item
*
create_1_arg
(
THD
*
thd
,
Item
*
arg1
);
static
Create_func_from_base64
s_singleton
;
protected:
Create_func_from_base64
()
{}
virtual
~
Create_func_from_base64
()
{}
};
class
Create_func_from_days
:
public
Create_func_arg1
{
public:
...
...
@@ -2357,6 +2370,19 @@ class Create_func_timediff : public Create_func_arg2
};
class
Create_func_to_base64
:
public
Create_func_arg1
{
public:
virtual
Item
*
create_1_arg
(
THD
*
thd
,
Item
*
arg1
);
static
Create_func_to_base64
s_singleton
;
protected:
Create_func_to_base64
()
{}
virtual
~
Create_func_to_base64
()
{}
};
class
Create_func_to_days
:
public
Create_func_arg1
{
public:
...
...
@@ -3812,6 +3838,16 @@ Create_func_format::create_native(THD *thd, LEX_STRING name,
}
Create_func_from_base64
Create_func_from_base64
::
s_singleton
;
Item
*
Create_func_from_base64
::
create_1_arg
(
THD
*
thd
,
Item
*
arg1
)
{
return
new
(
thd
->
mem_root
)
Item_func_from_base64
(
arg1
);
}
Create_func_found_rows
Create_func_found_rows
::
s_singleton
;
Item
*
...
...
@@ -5040,6 +5076,15 @@ Create_func_timediff::create_2_arg(THD *thd, Item *arg1, Item *arg2)
}
Create_func_to_base64
Create_func_to_base64
::
s_singleton
;
Item
*
Create_func_to_base64
::
create_1_arg
(
THD
*
thd
,
Item
*
arg1
)
{
return
new
(
thd
->
mem_root
)
Item_func_to_base64
(
arg1
);
}
Create_func_to_days
Create_func_to_days
::
s_singleton
;
Item
*
...
...
@@ -5393,6 +5438,7 @@ static Native_func_registry func_array[] =
{
{
C_STRING_WITH_LEN
(
"FLOOR"
)
},
BUILDER
(
Create_func_floor
)},
{
{
C_STRING_WITH_LEN
(
"FORMAT"
)
},
BUILDER
(
Create_func_format
)},
{
{
C_STRING_WITH_LEN
(
"FOUND_ROWS"
)
},
BUILDER
(
Create_func_found_rows
)},
{
{
C_STRING_WITH_LEN
(
"FROM_BASE64"
)
},
BUILDER
(
Create_func_from_base64
)},
{
{
C_STRING_WITH_LEN
(
"FROM_DAYS"
)
},
BUILDER
(
Create_func_from_days
)},
{
{
C_STRING_WITH_LEN
(
"FROM_UNIXTIME"
)
},
BUILDER
(
Create_func_from_unixtime
)},
{
{
C_STRING_WITH_LEN
(
"GEOMCOLLFROMTEXT"
)
},
GEOM_BUILDER
(
Create_func_geometry_from_text
)},
...
...
@@ -5576,6 +5622,7 @@ static Native_func_registry func_array[] =
{
{
C_STRING_WITH_LEN
(
"TIME_FORMAT"
)
},
BUILDER
(
Create_func_time_format
)},
{
{
C_STRING_WITH_LEN
(
"TIME_TO_SEC"
)
},
BUILDER
(
Create_func_time_to_sec
)},
{
{
C_STRING_WITH_LEN
(
"TOUCHES"
)
},
GEOM_BUILDER
(
Create_func_touches
)},
{
{
C_STRING_WITH_LEN
(
"TO_BASE64"
)
},
BUILDER
(
Create_func_to_base64
)},
{
{
C_STRING_WITH_LEN
(
"TO_DAYS"
)
},
BUILDER
(
Create_func_to_days
)},
{
{
C_STRING_WITH_LEN
(
"TO_SECONDS"
)
},
BUILDER
(
Create_func_to_seconds
)},
{
{
C_STRING_WITH_LEN
(
"UCASE"
)
},
BUILDER
(
Create_func_ucase
)},
...
...
sql/item_strfunc.cc
View file @
e33582d2
...
...
@@ -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
;
}
///////////////////////////////////////////////////////////////////////////////
...
...
sql/item_strfunc.h
View file @
e33582d2
...
...
@@ -116,6 +116,27 @@ class Item_func_sha2 :public Item_str_ascii_func
const
char
*
func_name
()
const
{
return
"sha2"
;
}
};
class
Item_func_to_base64
:
public
Item_str_ascii_func
{
String
tmp_value
;
public:
Item_func_to_base64
(
Item
*
a
)
:
Item_str_ascii_func
(
a
)
{}
String
*
val_str_ascii
(
String
*
);
void
fix_length_and_dec
();
const
char
*
func_name
()
const
{
return
"to_base64"
;
}
};
class
Item_func_from_base64
:
public
Item_str_func
{
String
tmp_value
;
public:
Item_func_from_base64
(
Item
*
a
)
:
Item_str_func
(
a
)
{}
String
*
val_str
(
String
*
);
void
fix_length_and_dec
();
const
char
*
func_name
()
const
{
return
"from_base64"
;
}
};
class
Item_func_aes_encrypt
:
public
Item_str_func
{
public:
...
...
sql/share/errmsg-utf8.txt
View file @
e33582d2
...
...
@@ -7058,3 +7058,5 @@ ER_NO_SUCH_QUERY
eng "Unknown query id: %lld"
ger "Unbekannte Abfrage-ID: %lld"
rus "Неизвестный номер запроса: %lld"
ER_BAD_BASE64_DATA
eng "Bad base64 data as position %u"
sql/sql_binlog.cc
View file @
e33582d2
...
...
@@ -118,7 +118,8 @@ void mysql_client_binlog_statement(THD* thd)
strptr
<
thd
->
lex
->
comment
.
str
+
thd
->
lex
->
comment
.
length
;
)
{
char
const
*
endptr
=
0
;
int
bytes_decoded
=
base64_decode
(
strptr
,
coded_len
,
buf
,
&
endptr
);
int
bytes_decoded
=
base64_decode
(
strptr
,
coded_len
,
buf
,
&
endptr
,
MY_BASE64_DECODE_ALLOW_MULTIPLE_CHUNKS
);
#ifndef HAVE_valgrind
/*
...
...
unittest/mysys/base64-t.c
View file @
e33582d2
...
...
@@ -60,7 +60,7 @@ main(int argc __attribute__((unused)),char *argv[])
/* Decode */
dst
=
(
char
*
)
malloc
(
base64_needed_decoded_length
(
strlen
(
str
)));
dst_len
=
base64_decode
(
str
,
strlen
(
str
),
dst
,
NULL
);
dst_len
=
base64_decode
(
str
,
strlen
(
str
),
dst
,
NULL
,
0
);
ok
(
dst_len
==
src_len
,
"Comparing lengths"
);
cmp
=
memcmp
(
src
,
dst
,
src_len
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment