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
9c960615
Commit
9c960615
authored
Oct 16, 2019
by
Alexander Barkov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Part2: MDEV-20837 Add MariaDB_FUNCTION_PLUGIN
Removing MariaDB_FUNCTION_COLLECTION_PLUGIN
parent
5a052ab6
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
69 additions
and
905 deletions
+69
-905
cmake/abi_check.cmake
cmake/abi_check.cmake
+0
-1
include/mysql/plugin.h
include/mysql/plugin.h
+1
-2
include/mysql/plugin_function_collection.h
include/mysql/plugin_function_collection.h
+0
-101
include/mysql/plugin_function_collection.h.pp
include/mysql/plugin_function_collection.h.pp
+0
-679
sql/item_create.cc
sql/item_create.cc
+34
-94
sql/item_create.h
sql/item_create.h
+25
-0
sql/item_geofunc.cc
sql/item_geofunc.cc
+4
-16
sql/sql_plugin.cc
sql/sql_plugin.cc
+5
-12
No files found.
cmake/abi_check.cmake
View file @
9c960615
...
...
@@ -47,7 +47,6 @@ IF(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang" AND RUN_ABI_CHECK)
${
CMAKE_SOURCE_DIR
}
/include/mysql/plugin_encryption.h
${
CMAKE_SOURCE_DIR
}
/include/mysql/plugin_data_type.h
${
CMAKE_SOURCE_DIR
}
/include/mysql/plugin_function.h
${
CMAKE_SOURCE_DIR
}
/include/mysql/plugin_function_collection.h
)
ADD_CUSTOM_TARGET
(
abi_check ALL
...
...
include/mysql/plugin.h
View file @
9c960615
...
...
@@ -90,14 +90,13 @@ typedef struct st_mysql_xid MYSQL_XID;
#define MYSQL_AUDIT_PLUGIN 5
#define MYSQL_REPLICATION_PLUGIN 6
#define MYSQL_AUTHENTICATION_PLUGIN 7
#define MYSQL_MAX_PLUGIN_TYPE_NUM 1
3
/* The number of plugin types */
#define MYSQL_MAX_PLUGIN_TYPE_NUM 1
2
/* The number of plugin types */
/* MariaDB plugin types */
#define MariaDB_PASSWORD_VALIDATION_PLUGIN 8
#define MariaDB_ENCRYPTION_PLUGIN 9
#define MariaDB_DATA_TYPE_PLUGIN 10
#define MariaDB_FUNCTION_PLUGIN 11
#define MariaDB_FUNCTION_COLLECTION_PLUGIN 12
/* We use the following strings to define licenses for plugins */
#define PLUGIN_LICENSE_PROPRIETARY 0
...
...
include/mysql/plugin_function_collection.h
deleted
100644 → 0
View file @
5a052ab6
#ifndef MARIADB_PLUGIN_FUNCTION_COLLECTION_INCLUDED
#define MARIADB_PLUGIN_FUNCTION_COLLECTION_INCLUDED
/* Copyright (C) 2019, Alexander Barkov and MariaDB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
/**
@file
Data Type Plugin API.
This file defines the API for server plugins that manage function collections.
*/
#ifdef __cplusplus
#include <mysql/plugin.h>
/*
API for data type plugins. (MariaDB_FUNCTION_COLLECTION_PLUGIN)
*/
#define MariaDB_FUNCTION_COLLECTION_INTERFACE_VERSION (MYSQL_VERSION_ID << 8)
class
Native_func_registry_array
{
const
Native_func_registry
*
m_elements
;
size_t
m_count
;
public:
Native_func_registry_array
()
:
m_elements
(
NULL
),
m_count
(
0
)
{
}
Native_func_registry_array
(
const
Native_func_registry
*
elements
,
size_t
count
)
:
m_elements
(
elements
),
m_count
(
count
)
{
}
const
Native_func_registry
&
element
(
size_t
i
)
const
{
DBUG_ASSERT
(
i
<
m_count
);
return
m_elements
[
i
];
}
size_t
count
()
const
{
return
m_count
;
}
};
class
Plugin_function_collection
{
int
m_interface_version
;
const
Native_func_registry_array
m_native_func_registry_array
;
HASH
m_hash
;
public:
bool
init
();
void
deinit
()
{
my_hash_free
(
&
m_hash
);
}
static
int
init_plugin
(
st_plugin_int
*
plugin
)
{
Plugin_function_collection
*
coll
=
reinterpret_cast
<
Plugin_function_collection
*>
(
plugin
->
plugin
->
info
);
return
coll
->
init
();
}
static
int
deinit_plugin
(
st_plugin_int
*
plugin
)
{
Plugin_function_collection
*
coll
=
reinterpret_cast
<
Plugin_function_collection
*>
(
plugin
->
plugin
->
info
);
coll
->
deinit
();
return
0
;
}
public:
Plugin_function_collection
(
int
interface_version
,
const
Native_func_registry_array
&
nfra
)
:
m_interface_version
(
interface_version
),
m_native_func_registry_array
(
nfra
)
{
bzero
((
void
*
)
&
m_hash
,
sizeof
(
m_hash
));
}
Create_func
*
find_native_function_builder
(
THD
*
thd
,
const
LEX_CSTRING
&
name
)
const
;
};
/**
Data type plugin descriptor
*/
#endif
/* __cplusplus */
#endif
/* MARIADB_PLUGIN_FUNCTION_COLLECTION_INCLUDED */
include/mysql/plugin_function_collection.h.pp
deleted
100644 → 0
View file @
5a052ab6
class
THD
;
class
Item
;
typedef
char
my_bool
;
typedef
void
*
MYSQL_PLUGIN
;
extern
"C"
{
extern
"C"
{
extern
struct
base64_service_st
{
int
(
*
base64_needed_encoded_length_ptr
)(
int
length_of_data
);
int
(
*
base64_encode_max_arg_length_ptr
)(
void
);
int
(
*
base64_needed_decoded_length_ptr
)(
int
length_of_encoded_data
);
int
(
*
base64_decode_max_arg_length_ptr
)();
int
(
*
base64_encode_ptr
)(
const
void
*
src
,
size_t
src_len
,
char
*
dst
);
int
(
*
base64_decode_ptr
)(
const
char
*
src
,
size_t
src_len
,
void
*
dst
,
const
char
**
end_ptr
,
int
flags
);
}
*
base64_service
;
int
my_base64_needed_encoded_length
(
int
length_of_data
);
int
my_base64_encode_max_arg_length
(
void
);
int
my_base64_needed_decoded_length
(
int
length_of_encoded_data
);
int
my_base64_decode_max_arg_length
();
int
my_base64_encode
(
const
void
*
src
,
size_t
src_len
,
char
*
dst
);
int
my_base64_decode
(
const
char
*
src
,
size_t
src_len
,
void
*
dst
,
const
char
**
end_ptr
,
int
flags
);
}
extern
"C"
{
extern
void
(
*
debug_sync_C_callback_ptr
)(
THD
*
,
const
char
*
,
size_t
);
}
extern
"C"
{
struct
encryption_service_st
{
unsigned
int
(
*
encryption_key_get_latest_version_func
)(
unsigned
int
key_id
);
unsigned
int
(
*
encryption_key_get_func
)(
unsigned
int
key_id
,
unsigned
int
key_version
,
unsigned
char
*
buffer
,
unsigned
int
*
length
);
unsigned
int
(
*
encryption_ctx_size_func
)(
unsigned
int
key_id
,
unsigned
int
key_version
);
int
(
*
encryption_ctx_init_func
)(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
klen
,
const
unsigned
char
*
iv
,
unsigned
int
ivlen
,
int
flags
,
unsigned
int
key_id
,
unsigned
int
key_version
);
int
(
*
encryption_ctx_update_func
)(
void
*
ctx
,
const
unsigned
char
*
src
,
unsigned
int
slen
,
unsigned
char
*
dst
,
unsigned
int
*
dlen
);
int
(
*
encryption_ctx_finish_func
)(
void
*
ctx
,
unsigned
char
*
dst
,
unsigned
int
*
dlen
);
unsigned
int
(
*
encryption_encrypted_length_func
)(
unsigned
int
slen
,
unsigned
int
key_id
,
unsigned
int
key_version
);
};
extern
struct
encryption_service_st
encryption_handler
;
static
inline
unsigned
int
encryption_key_id_exists
(
unsigned
int
id
)
{
return
encryption_handler
.
encryption_key_get_latest_version_func
(
id
)
!=
(
~
(
unsigned
int
)
0
);
}
static
inline
unsigned
int
encryption_key_version_exists
(
unsigned
int
id
,
unsigned
int
version
)
{
unsigned
int
unused
;
return
encryption_handler
.
encryption_key_get_func
((
id
),(
version
),(
NULL
),(
&
unused
))
!=
(
~
(
unsigned
int
)
0
);
}
static
inline
int
encryption_crypt
(
const
unsigned
char
*
src
,
unsigned
int
slen
,
unsigned
char
*
dst
,
unsigned
int
*
dlen
,
const
unsigned
char
*
key
,
unsigned
int
klen
,
const
unsigned
char
*
iv
,
unsigned
int
ivlen
,
int
flags
,
unsigned
int
key_id
,
unsigned
int
key_version
)
{
void
*
ctx
=
alloca
(
encryption_handler
.
encryption_ctx_size_func
((
key_id
),(
key_version
)));
int
res1
,
res2
;
unsigned
int
d1
,
d2
;
if
((
res1
=
encryption_handler
.
encryption_ctx_init_func
((
ctx
),(
key
),(
klen
),(
iv
),(
ivlen
),(
flags
),(
key_id
),(
key_version
))))
return
res1
;
res1
=
encryption_handler
.
encryption_ctx_update_func
((
ctx
),(
src
),(
slen
),(
dst
),(
&
d1
));
res2
=
encryption_handler
.
encryption_ctx_finish_func
((
ctx
),(
dst
+
d1
),(
&
d2
));
*
dlen
=
d1
+
d2
;
return
res1
?
res1
:
res2
;
}
}
extern
"C"
{
struct
st_encryption_scheme_key
{
unsigned
int
version
;
unsigned
char
key
[
16
];
};
struct
st_encryption_scheme
{
unsigned
char
iv
[
16
];
struct
st_encryption_scheme_key
key
[
3
];
unsigned
int
keyserver_requests
;
unsigned
int
key_id
;
unsigned
int
type
;
void
(
*
locker
)(
struct
st_encryption_scheme
*
self
,
int
release
);
};
extern
struct
encryption_scheme_service_st
{
int
(
*
encryption_scheme_encrypt_func
)
(
const
unsigned
char
*
src
,
unsigned
int
slen
,
unsigned
char
*
dst
,
unsigned
int
*
dlen
,
struct
st_encryption_scheme
*
scheme
,
unsigned
int
key_version
,
unsigned
int
i32_1
,
unsigned
int
i32_2
,
unsigned
long
long
i64
);
int
(
*
encryption_scheme_decrypt_func
)
(
const
unsigned
char
*
src
,
unsigned
int
slen
,
unsigned
char
*
dst
,
unsigned
int
*
dlen
,
struct
st_encryption_scheme
*
scheme
,
unsigned
int
key_version
,
unsigned
int
i32_1
,
unsigned
int
i32_2
,
unsigned
long
long
i64
);
}
*
encryption_scheme_service
;
int
encryption_scheme_encrypt
(
const
unsigned
char
*
src
,
unsigned
int
slen
,
unsigned
char
*
dst
,
unsigned
int
*
dlen
,
struct
st_encryption_scheme
*
scheme
,
unsigned
int
key_version
,
unsigned
int
i32_1
,
unsigned
int
i32_2
,
unsigned
long
long
i64
);
int
encryption_scheme_decrypt
(
const
unsigned
char
*
src
,
unsigned
int
slen
,
unsigned
char
*
dst
,
unsigned
int
*
dlen
,
struct
st_encryption_scheme
*
scheme
,
unsigned
int
key_version
,
unsigned
int
i32_1
,
unsigned
int
i32_2
,
unsigned
long
long
i64
);
}
extern
"C"
{
enum
thd_kill_levels
{
THD_IS_NOT_KILLED
=
0
,
THD_ABORT_SOFTLY
=
50
,
THD_ABORT_ASAP
=
100
,
};
extern
struct
kill_statement_service_st
{
enum
thd_kill_levels
(
*
thd_kill_level_func
)(
const
THD
*
);
}
*
thd_kill_statement_service
;
enum
thd_kill_levels
thd_kill_level
(
const
THD
*
);
}
extern
"C"
{
typedef
struct
logger_handle_st
LOGGER_HANDLE
;
extern
struct
logger_service_st
{
void
(
*
logger_init_mutexes
)();
LOGGER_HANDLE
*
(
*
open
)(
const
char
*
path
,
unsigned
long
long
size_limit
,
unsigned
int
rotations
);
int
(
*
close
)(
LOGGER_HANDLE
*
log
);
int
(
*
vprintf
)(
LOGGER_HANDLE
*
log
,
const
char
*
fmt
,
va_list
argptr
);
int
(
*
printf
)(
LOGGER_HANDLE
*
log
,
const
char
*
fmt
,
...
);
int
(
*
write
)(
LOGGER_HANDLE
*
log
,
const
char
*
buffer
,
size_t
size
);
int
(
*
rotate
)(
LOGGER_HANDLE
*
log
);
}
*
logger_service
;
void
logger_init_mutexes
();
LOGGER_HANDLE
*
logger_open
(
const
char
*
path
,
unsigned
long
long
size_limit
,
unsigned
int
rotations
);
int
logger_close
(
LOGGER_HANDLE
*
log
);
int
logger_vprintf
(
LOGGER_HANDLE
*
log
,
const
char
*
fmt
,
va_list
argptr
);
int
logger_printf
(
LOGGER_HANDLE
*
log
,
const
char
*
fmt
,
...
);
int
logger_write
(
LOGGER_HANDLE
*
log
,
const
char
*
buffer
,
size_t
size
);
int
logger_rotate
(
LOGGER_HANDLE
*
log
);
}
extern
"C"
{
extern
struct
my_md5_service_st
{
void
(
*
my_md5_type
)(
unsigned
char
*
,
const
char
*
,
size_t
);
void
(
*
my_md5_multi_type
)(
unsigned
char
*
,
...
);
size_t
(
*
my_md5_context_size_type
)();
void
(
*
my_md5_init_type
)(
void
*
);
void
(
*
my_md5_input_type
)(
void
*
,
const
unsigned
char
*
,
size_t
);
void
(
*
my_md5_result_type
)(
void
*
,
unsigned
char
*
);
}
*
my_md5_service
;
void
my_md5
(
unsigned
char
*
,
const
char
*
,
size_t
);
void
my_md5_multi
(
unsigned
char
*
,
...
);
size_t
my_md5_context_size
();
void
my_md5_init
(
void
*
context
);
void
my_md5_input
(
void
*
context
,
const
unsigned
char
*
buf
,
size_t
len
);
void
my_md5_result
(
void
*
context
,
unsigned
char
*
digest
);
}
extern
"C"
{
enum
my_aes_mode
{
MY_AES_ECB
,
MY_AES_CBC
};
extern
struct
my_crypt_service_st
{
int
(
*
my_aes_crypt_init
)(
void
*
ctx
,
enum
my_aes_mode
mode
,
int
flags
,
const
unsigned
char
*
key
,
unsigned
int
klen
,
const
unsigned
char
*
iv
,
unsigned
int
ivlen
);
int
(
*
my_aes_crypt_update
)(
void
*
ctx
,
const
unsigned
char
*
src
,
unsigned
int
slen
,
unsigned
char
*
dst
,
unsigned
int
*
dlen
);
int
(
*
my_aes_crypt_finish
)(
void
*
ctx
,
unsigned
char
*
dst
,
unsigned
int
*
dlen
);
int
(
*
my_aes_crypt
)(
enum
my_aes_mode
mode
,
int
flags
,
const
unsigned
char
*
src
,
unsigned
int
slen
,
unsigned
char
*
dst
,
unsigned
int
*
dlen
,
const
unsigned
char
*
key
,
unsigned
int
klen
,
const
unsigned
char
*
iv
,
unsigned
int
ivlen
);
unsigned
int
(
*
my_aes_get_size
)(
enum
my_aes_mode
mode
,
unsigned
int
source_length
);
unsigned
int
(
*
my_aes_ctx_size
)(
enum
my_aes_mode
mode
);
int
(
*
my_random_bytes
)(
unsigned
char
*
buf
,
int
num
);
}
*
my_crypt_service
;
int
my_aes_crypt_init
(
void
*
ctx
,
enum
my_aes_mode
mode
,
int
flags
,
const
unsigned
char
*
key
,
unsigned
int
klen
,
const
unsigned
char
*
iv
,
unsigned
int
ivlen
);
int
my_aes_crypt_update
(
void
*
ctx
,
const
unsigned
char
*
src
,
unsigned
int
slen
,
unsigned
char
*
dst
,
unsigned
int
*
dlen
);
int
my_aes_crypt_finish
(
void
*
ctx
,
unsigned
char
*
dst
,
unsigned
int
*
dlen
);
int
my_aes_crypt
(
enum
my_aes_mode
mode
,
int
flags
,
const
unsigned
char
*
src
,
unsigned
int
slen
,
unsigned
char
*
dst
,
unsigned
int
*
dlen
,
const
unsigned
char
*
key
,
unsigned
int
klen
,
const
unsigned
char
*
iv
,
unsigned
int
ivlen
);
int
my_random_bytes
(
unsigned
char
*
buf
,
int
num
);
unsigned
int
my_aes_get_size
(
enum
my_aes_mode
mode
,
unsigned
int
source_length
);
unsigned
int
my_aes_ctx_size
(
enum
my_aes_mode
mode
);
}
extern
"C"
{
extern
struct
my_print_error_service_st
{
void
(
*
my_error_func
)(
unsigned
int
nr
,
unsigned
long
MyFlags
,
...
);
void
(
*
my_printf_error_func
)(
unsigned
int
nr
,
const
char
*
fmt
,
unsigned
long
MyFlags
,
...
);
void
(
*
my_printv_error_func
)(
unsigned
int
error
,
const
char
*
format
,
unsigned
long
MyFlags
,
va_list
ap
);
}
*
my_print_error_service
;
extern
void
my_error
(
unsigned
int
nr
,
unsigned
long
MyFlags
,
...
);
extern
void
my_printf_error
(
unsigned
int
my_err
,
const
char
*
format
,
unsigned
long
MyFlags
,
...
);
extern
void
my_printv_error
(
unsigned
int
error
,
const
char
*
format
,
unsigned
long
MyFlags
,
va_list
ap
);
}
extern
"C"
{
extern
struct
my_snprintf_service_st
{
size_t
(
*
my_snprintf_type
)(
char
*
,
size_t
,
const
char
*
,
...
);
size_t
(
*
my_vsnprintf_type
)(
char
*
,
size_t
,
const
char
*
,
va_list
);
}
*
my_snprintf_service
;
size_t
my_snprintf
(
char
*
to
,
size_t
n
,
const
char
*
fmt
,
...
);
size_t
my_vsnprintf
(
char
*
to
,
size_t
n
,
const
char
*
fmt
,
va_list
ap
);
}
extern
"C"
{
extern
struct
progress_report_service_st
{
void
(
*
thd_progress_init_func
)(
THD
*
thd
,
unsigned
int
max_stage
);
void
(
*
thd_progress_report_func
)(
THD
*
thd
,
unsigned
long
long
progress
,
unsigned
long
long
max_progress
);
void
(
*
thd_progress_next_stage_func
)(
THD
*
thd
);
void
(
*
thd_progress_end_func
)(
THD
*
thd
);
const
char
*
(
*
set_thd_proc_info_func
)(
THD
*
,
const
char
*
info
,
const
char
*
func
,
const
char
*
file
,
unsigned
int
line
);
}
*
progress_report_service
;
void
thd_progress_init
(
THD
*
thd
,
unsigned
int
max_stage
);
void
thd_progress_report
(
THD
*
thd
,
unsigned
long
long
progress
,
unsigned
long
long
max_progress
);
void
thd_progress_next_stage
(
THD
*
thd
);
void
thd_progress_end
(
THD
*
thd
);
const
char
*
set_thd_proc_info
(
THD
*
,
const
char
*
info
,
const
char
*
func
,
const
char
*
file
,
unsigned
int
line
);
}
extern
"C"
{
extern
struct
my_sha1_service_st
{
void
(
*
my_sha1_type
)(
unsigned
char
*
,
const
char
*
,
size_t
);
void
(
*
my_sha1_multi_type
)(
unsigned
char
*
,
...
);
size_t
(
*
my_sha1_context_size_type
)();
void
(
*
my_sha1_init_type
)(
void
*
);
void
(
*
my_sha1_input_type
)(
void
*
,
const
unsigned
char
*
,
size_t
);
void
(
*
my_sha1_result_type
)(
void
*
,
unsigned
char
*
);
}
*
my_sha1_service
;
void
my_sha1
(
unsigned
char
*
,
const
char
*
,
size_t
);
void
my_sha1_multi
(
unsigned
char
*
,
...
);
size_t
my_sha1_context_size
();
void
my_sha1_init
(
void
*
context
);
void
my_sha1_input
(
void
*
context
,
const
unsigned
char
*
buf
,
size_t
len
);
void
my_sha1_result
(
void
*
context
,
unsigned
char
*
digest
);
}
extern
"C"
{
extern
struct
my_sha2_service_st
{
void
(
*
my_sha224_type
)(
unsigned
char
*
,
const
char
*
,
size_t
);
void
(
*
my_sha224_multi_type
)(
unsigned
char
*
,
...
);
size_t
(
*
my_sha224_context_size_type
)();
void
(
*
my_sha224_init_type
)(
void
*
);
void
(
*
my_sha224_input_type
)(
void
*
,
const
unsigned
char
*
,
size_t
);
void
(
*
my_sha224_result_type
)(
void
*
,
unsigned
char
*
);
void
(
*
my_sha256_type
)(
unsigned
char
*
,
const
char
*
,
size_t
);
void
(
*
my_sha256_multi_type
)(
unsigned
char
*
,
...
);
size_t
(
*
my_sha256_context_size_type
)();
void
(
*
my_sha256_init_type
)(
void
*
);
void
(
*
my_sha256_input_type
)(
void
*
,
const
unsigned
char
*
,
size_t
);
void
(
*
my_sha256_result_type
)(
void
*
,
unsigned
char
*
);
void
(
*
my_sha384_type
)(
unsigned
char
*
,
const
char
*
,
size_t
);
void
(
*
my_sha384_multi_type
)(
unsigned
char
*
,
...
);
size_t
(
*
my_sha384_context_size_type
)();
void
(
*
my_sha384_init_type
)(
void
*
);
void
(
*
my_sha384_input_type
)(
void
*
,
const
unsigned
char
*
,
size_t
);
void
(
*
my_sha384_result_type
)(
void
*
,
unsigned
char
*
);
void
(
*
my_sha512_type
)(
unsigned
char
*
,
const
char
*
,
size_t
);
void
(
*
my_sha512_multi_type
)(
unsigned
char
*
,
...
);
size_t
(
*
my_sha512_context_size_type
)();
void
(
*
my_sha512_init_type
)(
void
*
);
void
(
*
my_sha512_input_type
)(
void
*
,
const
unsigned
char
*
,
size_t
);
void
(
*
my_sha512_result_type
)(
void
*
,
unsigned
char
*
);
}
*
my_sha2_service
;
void
my_sha224
(
unsigned
char
*
,
const
char
*
,
size_t
);
void
my_sha224_multi
(
unsigned
char
*
,
...
);
size_t
my_sha224_context_size
();
void
my_sha224_init
(
void
*
context
);
void
my_sha224_input
(
void
*
context
,
const
unsigned
char
*
buf
,
size_t
len
);
void
my_sha224_result
(
void
*
context
,
unsigned
char
*
digest
);
void
my_sha256
(
unsigned
char
*
,
const
char
*
,
size_t
);
void
my_sha256_multi
(
unsigned
char
*
,
...
);
size_t
my_sha256_context_size
();
void
my_sha256_init
(
void
*
context
);
void
my_sha256_input
(
void
*
context
,
const
unsigned
char
*
buf
,
size_t
len
);
void
my_sha256_result
(
void
*
context
,
unsigned
char
*
digest
);
void
my_sha384
(
unsigned
char
*
,
const
char
*
,
size_t
);
void
my_sha384_multi
(
unsigned
char
*
,
...
);
size_t
my_sha384_context_size
();
void
my_sha384_init
(
void
*
context
);
void
my_sha384_input
(
void
*
context
,
const
unsigned
char
*
buf
,
size_t
len
);
void
my_sha384_result
(
void
*
context
,
unsigned
char
*
digest
);
void
my_sha512
(
unsigned
char
*
,
const
char
*
,
size_t
);
void
my_sha512_multi
(
unsigned
char
*
,
...
);
size_t
my_sha512_context_size
();
void
my_sha512_init
(
void
*
context
);
void
my_sha512_input
(
void
*
context
,
const
unsigned
char
*
buf
,
size_t
len
);
void
my_sha512_result
(
void
*
context
,
unsigned
char
*
digest
);
}
extern
"C"
{
struct
st_mysql_lex_string
{
char
*
str
;
size_t
length
;
};
typedef
struct
st_mysql_lex_string
MYSQL_LEX_STRING
;
struct
st_mysql_const_lex_string
{
const
char
*
str
;
size_t
length
;
};
typedef
struct
st_mysql_const_lex_string
MYSQL_CONST_LEX_STRING
;
extern
struct
thd_alloc_service_st
{
void
*
(
*
thd_alloc_func
)(
THD
*
,
size_t
);
void
*
(
*
thd_calloc_func
)(
THD
*
,
size_t
);
char
*
(
*
thd_strdup_func
)(
THD
*
,
const
char
*
);
char
*
(
*
thd_strmake_func
)(
THD
*
,
const
char
*
,
size_t
);
void
*
(
*
thd_memdup_func
)(
THD
*
,
const
void
*
,
size_t
);
MYSQL_CONST_LEX_STRING
*
(
*
thd_make_lex_string_func
)(
THD
*
,
MYSQL_CONST_LEX_STRING
*
,
const
char
*
,
size_t
,
int
);
}
*
thd_alloc_service
;
void
*
thd_alloc
(
THD
*
thd
,
size_t
size
);
void
*
thd_calloc
(
THD
*
thd
,
size_t
size
);
char
*
thd_strdup
(
THD
*
thd
,
const
char
*
str
);
char
*
thd_strmake
(
THD
*
thd
,
const
char
*
str
,
size_t
size
);
void
*
thd_memdup
(
THD
*
thd
,
const
void
*
str
,
size_t
size
);
MYSQL_CONST_LEX_STRING
*
thd_make_lex_string
(
THD
*
thd
,
MYSQL_CONST_LEX_STRING
*
lex_str
,
const
char
*
str
,
size_t
size
,
int
allocate_lex_string
);
}
extern
"C"
{
extern
struct
thd_autoinc_service_st
{
void
(
*
thd_get_autoinc_func
)(
const
THD
*
thd
,
unsigned
long
*
off
,
unsigned
long
*
inc
);
}
*
thd_autoinc_service
;
void
thd_get_autoinc
(
const
THD
*
thd
,
unsigned
long
*
off
,
unsigned
long
*
inc
);
}
extern
"C"
{
extern
struct
thd_error_context_service_st
{
const
char
*
(
*
thd_get_error_message_func
)(
const
THD
*
thd
);
unsigned
int
(
*
thd_get_error_number_func
)(
const
THD
*
thd
);
unsigned
long
(
*
thd_get_error_row_func
)(
const
THD
*
thd
);
void
(
*
thd_inc_error_row_func
)(
THD
*
thd
);
char
*
(
*
thd_get_error_context_description_func
)(
THD
*
thd
,
char
*
buffer
,
unsigned
int
length
,
unsigned
int
max_query_length
);
}
*
thd_error_context_service
;
const
char
*
thd_get_error_message
(
const
THD
*
thd
);
unsigned
int
thd_get_error_number
(
const
THD
*
thd
);
unsigned
long
thd_get_error_row
(
const
THD
*
thd
);
void
thd_inc_error_row
(
THD
*
thd
);
char
*
thd_get_error_context_description
(
THD
*
thd
,
char
*
buffer
,
unsigned
int
length
,
unsigned
int
max_query_length
);
}
extern
"C"
{
extern
struct
thd_rnd_service_st
{
double
(
*
thd_rnd_ptr
)(
THD
*
thd
);
void
(
*
thd_c_r_p_ptr
)(
THD
*
thd
,
char
*
to
,
size_t
length
);
}
*
thd_rnd_service
;
double
thd_rnd
(
THD
*
thd
);
void
thd_create_random_password
(
THD
*
thd
,
char
*
to
,
size_t
length
);
}
extern
"C"
{
typedef
int
MYSQL_THD_KEY_T
;
extern
struct
thd_specifics_service_st
{
int
(
*
thd_key_create_func
)(
MYSQL_THD_KEY_T
*
key
);
void
(
*
thd_key_delete_func
)(
MYSQL_THD_KEY_T
*
key
);
void
*
(
*
thd_getspecific_func
)(
THD
*
thd
,
MYSQL_THD_KEY_T
key
);
int
(
*
thd_setspecific_func
)(
THD
*
thd
,
MYSQL_THD_KEY_T
key
,
void
*
value
);
}
*
thd_specifics_service
;
int
thd_key_create
(
MYSQL_THD_KEY_T
*
key
);
void
thd_key_delete
(
MYSQL_THD_KEY_T
*
key
);
void
*
thd_getspecific
(
THD
*
thd
,
MYSQL_THD_KEY_T
key
);
int
thd_setspecific
(
THD
*
thd
,
MYSQL_THD_KEY_T
key
,
void
*
value
);
}
typedef
long
my_time_t
;
enum
enum_mysql_timestamp_type
{
MYSQL_TIMESTAMP_NONE
=
-
2
,
MYSQL_TIMESTAMP_ERROR
=
-
1
,
MYSQL_TIMESTAMP_DATE
=
0
,
MYSQL_TIMESTAMP_DATETIME
=
1
,
MYSQL_TIMESTAMP_TIME
=
2
};
typedef
struct
st_mysql_time
{
unsigned
int
year
,
month
,
day
,
hour
,
minute
,
second
;
unsigned
long
second_part
;
my_bool
neg
;
enum
enum_mysql_timestamp_type
time_type
;
}
MYSQL_TIME
;
extern
"C"
{
extern
struct
thd_timezone_service_st
{
my_time_t
(
*
thd_TIME_to_gmt_sec
)(
THD
*
thd
,
const
MYSQL_TIME
*
ltime
,
unsigned
int
*
errcode
);
void
(
*
thd_gmt_sec_to_TIME
)(
THD
*
thd
,
MYSQL_TIME
*
ltime
,
my_time_t
t
);
}
*
thd_timezone_service
;
my_time_t
thd_TIME_to_gmt_sec
(
THD
*
thd
,
const
MYSQL_TIME
*
ltime
,
unsigned
int
*
errcode
);
void
thd_gmt_sec_to_TIME
(
THD
*
thd
,
MYSQL_TIME
*
ltime
,
my_time_t
t
);
}
extern
"C"
{
typedef
enum
_thd_wait_type_e
{
THD_WAIT_SLEEP
=
1
,
THD_WAIT_DISKIO
=
2
,
THD_WAIT_ROW_LOCK
=
3
,
THD_WAIT_GLOBAL_LOCK
=
4
,
THD_WAIT_META_DATA_LOCK
=
5
,
THD_WAIT_TABLE_LOCK
=
6
,
THD_WAIT_USER_LOCK
=
7
,
THD_WAIT_BINLOG
=
8
,
THD_WAIT_GROUP_COMMIT
=
9
,
THD_WAIT_SYNC
=
10
,
THD_WAIT_NET
=
11
,
THD_WAIT_LAST
=
12
}
thd_wait_type
;
extern
struct
thd_wait_service_st
{
void
(
*
thd_wait_begin_func
)(
THD
*
,
int
);
void
(
*
thd_wait_end_func
)(
THD
*
);
}
*
thd_wait_service
;
void
thd_wait_begin
(
THD
*
thd
,
int
wait_type
);
void
thd_wait_end
(
THD
*
thd
);
}
extern
"C"
{
enum
json_types
{
JSV_BAD_JSON
=-
1
,
JSV_NOTHING
=
0
,
JSV_OBJECT
=
1
,
JSV_ARRAY
=
2
,
JSV_STRING
=
3
,
JSV_NUMBER
=
4
,
JSV_TRUE
=
5
,
JSV_FALSE
=
6
,
JSV_NULL
=
7
};
extern
struct
json_service_st
{
enum
json_types
(
*
json_type
)(
const
char
*
js
,
const
char
*
js_end
,
const
char
**
value
,
int
*
value_len
);
enum
json_types
(
*
json_get_array_item
)(
const
char
*
js
,
const
char
*
js_end
,
int
n_item
,
const
char
**
value
,
int
*
value_len
);
enum
json_types
(
*
json_get_object_key
)(
const
char
*
js
,
const
char
*
js_end
,
const
char
*
key
,
const
char
**
value
,
int
*
value_len
);
enum
json_types
(
*
json_get_object_nkey
)(
const
char
*
js
,
const
char
*
js_end
,
int
nkey
,
const
char
**
keyname
,
const
char
**
keyname_end
,
const
char
**
value
,
int
*
value_len
);
int
(
*
json_escape_string
)(
const
char
*
str
,
const
char
*
str_end
,
char
*
json
,
char
*
json_end
);
int
(
*
json_unescape_json
)(
const
char
*
json_str
,
const
char
*
json_end
,
char
*
res
,
char
*
res_end
);
}
*
json_service
;
enum
json_types
json_type
(
const
char
*
js
,
const
char
*
js_end
,
const
char
**
value
,
int
*
value_len
);
enum
json_types
json_get_array_item
(
const
char
*
js
,
const
char
*
js_end
,
int
n_item
,
const
char
**
value
,
int
*
value_len
);
enum
json_types
json_get_object_key
(
const
char
*
js
,
const
char
*
js_end
,
const
char
*
key
,
const
char
**
value
,
int
*
value_len
);
enum
json_types
json_get_object_nkey
(
const
char
*
js
,
const
char
*
js_end
,
int
nkey
,
const
char
**
keyname
,
const
char
**
keyname_end
,
const
char
**
value
,
int
*
value_len
);
int
json_escape_string
(
const
char
*
str
,
const
char
*
str_end
,
char
*
json
,
char
*
json_end
);
int
json_unescape_json
(
const
char
*
json_str
,
const
char
*
json_end
,
char
*
res
,
char
*
res_end
);
}
}
struct
st_mysql_xid
{
long
formatID
;
long
gtrid_length
;
long
bqual_length
;
char
data
[
128
];
};
typedef
struct
st_mysql_xid
MYSQL_XID
;
enum
enum_mysql_show_type
{
SHOW_UNDEF
,
SHOW_BOOL
,
SHOW_UINT
,
SHOW_ULONG
,
SHOW_ULONGLONG
,
SHOW_CHAR
,
SHOW_CHAR_PTR
,
SHOW_ARRAY
,
SHOW_FUNC
,
SHOW_DOUBLE
,
SHOW_SINT
,
SHOW_SLONG
,
SHOW_SLONGLONG
,
SHOW_SIMPLE_FUNC
,
SHOW_SIZE_T
,
SHOW_always_last
};
enum
enum_var_type
{
SHOW_OPT_DEFAULT
=
0
,
SHOW_OPT_SESSION
,
SHOW_OPT_GLOBAL
};
struct
st_mysql_show_var
{
const
char
*
name
;
void
*
value
;
enum
enum_mysql_show_type
type
;
};
struct
system_status_var
;
typedef
int
(
*
mysql_show_var_func
)(
THD
*
,
struct
st_mysql_show_var
*
,
void
*
,
struct
system_status_var
*
status_var
,
enum
enum_var_type
);
struct
st_mysql_sys_var
;
struct
st_mysql_value
;
typedef
int
(
*
mysql_var_check_func
)(
THD
*
thd
,
struct
st_mysql_sys_var
*
var
,
void
*
save
,
struct
st_mysql_value
*
value
);
typedef
void
(
*
mysql_var_update_func
)(
THD
*
thd
,
struct
st_mysql_sys_var
*
var
,
void
*
var_ptr
,
const
void
*
save
);
struct
st_mysql_plugin
{
int
type
;
void
*
info
;
const
char
*
name
;
const
char
*
author
;
const
char
*
descr
;
int
license
;
int
(
*
init
)(
void
*
);
int
(
*
deinit
)(
void
*
);
unsigned
int
version
;
struct
st_mysql_show_var
*
status_vars
;
struct
st_mysql_sys_var
**
system_vars
;
void
*
__reserved1
;
unsigned
long
flags
;
};
struct
st_maria_plugin
{
int
type
;
void
*
info
;
const
char
*
name
;
const
char
*
author
;
const
char
*
descr
;
int
license
;
int
(
*
init
)(
void
*
);
int
(
*
deinit
)(
void
*
);
unsigned
int
version
;
struct
st_mysql_show_var
*
status_vars
;
struct
st_mysql_sys_var
**
system_vars
;
const
char
*
version_info
;
unsigned
int
maturity
;
};
extern
"C"
{
enum
enum_ftparser_mode
{
MYSQL_FTPARSER_SIMPLE_MODE
=
0
,
MYSQL_FTPARSER_WITH_STOPWORDS
=
1
,
MYSQL_FTPARSER_FULL_BOOLEAN_INFO
=
2
};
enum
enum_ft_token_type
{
FT_TOKEN_EOF
=
0
,
FT_TOKEN_WORD
=
1
,
FT_TOKEN_LEFT_PAREN
=
2
,
FT_TOKEN_RIGHT_PAREN
=
3
,
FT_TOKEN_STOPWORD
=
4
};
typedef
struct
st_mysql_ftparser_boolean_info
{
enum
enum_ft_token_type
type
;
int
yesno
;
int
weight_adjust
;
char
wasign
;
char
trunc
;
char
prev
;
char
*
quot
;
}
MYSQL_FTPARSER_BOOLEAN_INFO
;
typedef
struct
st_mysql_ftparser_param
{
int
(
*
mysql_parse
)(
struct
st_mysql_ftparser_param
*
,
const
char
*
doc
,
int
doc_len
);
int
(
*
mysql_add_word
)(
struct
st_mysql_ftparser_param
*
,
const
char
*
word
,
int
word_len
,
MYSQL_FTPARSER_BOOLEAN_INFO
*
boolean_info
);
void
*
ftparser_state
;
void
*
mysql_ftparam
;
const
struct
charset_info_st
*
cs
;
const
char
*
doc
;
int
length
;
unsigned
int
flags
;
enum
enum_ftparser_mode
mode
;
}
MYSQL_FTPARSER_PARAM
;
struct
st_mysql_ftparser
{
int
interface_version
;
int
(
*
parse
)(
MYSQL_FTPARSER_PARAM
*
param
);
int
(
*
init
)(
MYSQL_FTPARSER_PARAM
*
param
);
int
(
*
deinit
)(
MYSQL_FTPARSER_PARAM
*
param
);
};
}
struct
st_mysql_daemon
{
int
interface_version
;
};
struct
st_mysql_information_schema
{
int
interface_version
;
};
struct
st_mysql_storage_engine
{
int
interface_version
;
};
struct
handlerton
;
struct
Mysql_replication
{
int
interface_version
;
};
struct
st_mysql_value
{
int
(
*
value_type
)(
struct
st_mysql_value
*
);
const
char
*
(
*
val_str
)(
struct
st_mysql_value
*
,
char
*
buffer
,
int
*
length
);
int
(
*
val_real
)(
struct
st_mysql_value
*
,
double
*
realbuf
);
int
(
*
val_int
)(
struct
st_mysql_value
*
,
long
long
*
intbuf
);
int
(
*
is_unsigned
)(
struct
st_mysql_value
*
);
};
extern
"C"
{
int
thd_in_lock_tables
(
const
THD
*
thd
);
int
thd_tablespace_op
(
const
THD
*
thd
);
long
long
thd_test_options
(
const
THD
*
thd
,
long
long
test_options
);
int
thd_sql_command
(
const
THD
*
thd
);
void
thd_storage_lock_wait
(
THD
*
thd
,
long
long
value
);
int
thd_tx_isolation
(
const
THD
*
thd
);
int
thd_tx_is_read_only
(
const
THD
*
thd
);
int
mysql_tmpfile
(
const
char
*
prefix
);
unsigned
long
thd_get_thread_id
(
const
THD
*
thd
);
void
thd_get_xid
(
const
THD
*
thd
,
MYSQL_XID
*
xid
);
void
mysql_query_cache_invalidate4
(
THD
*
thd
,
const
char
*
key
,
unsigned
int
key_length
,
int
using_trx
);
void
*
thd_get_ha_data
(
const
THD
*
thd
,
const
struct
handlerton
*
hton
);
void
thd_set_ha_data
(
THD
*
thd
,
const
struct
handlerton
*
hton
,
const
void
*
ha_data
);
void
thd_wakeup_subsequent_commits
(
THD
*
thd
,
int
wakeup_error
);
}
class
Native_func_registry_array
{
const
Native_func_registry
*
m_elements
;
size_t
m_count
;
public
:
Native_func_registry_array
()
:
m_elements
(
NULL
),
m_count
(
0
)
{
}
Native_func_registry_array
(
const
Native_func_registry
*
elements
,
size_t
count
)
:
m_elements
(
elements
),
m_count
(
count
)
{
}
const
Native_func_registry
&
element
(
size_t
i
)
const
{
DBUG_ASSERT
(
i
<
m_count
);
return
m_elements
[
i
];
}
size_t
count
()
const
{
return
m_count
;
}
};
class
Plugin_function_collection
{
int
m_interface_version
;
const
Native_func_registry_array
m_native_func_registry_array
;
HASH
m_hash
;
public
:
bool
init
();
void
deinit
()
{
my_hash_free
(
&
m_hash
);
}
static
int
init_plugin
(
st_plugin_int
*
plugin
)
{
Plugin_function_collection
*
coll
=
reinterpret_cast
<
Plugin_function_collection
*>
(
plugin
->
plugin
->
info
);
return
coll
->
init
();
}
static
int
deinit_plugin
(
st_plugin_int
*
plugin
)
{
Plugin_function_collection
*
coll
=
reinterpret_cast
<
Plugin_function_collection
*>
(
plugin
->
plugin
->
info
);
coll
->
deinit
();
return
0
;
}
public
:
Plugin_function_collection
(
int
interface_version
,
const
Native_func_registry_array
&
nfra
)
:
m_interface_version
(
interface_version
),
m_native_func_registry_array
(
nfra
)
{
bzero
((
void
*
)
&
m_hash
,
sizeof
(
m_hash
));
}
Create_func
*
find_native_function_builder
(
THD
*
thd
,
const
LEX_CSTRING
&
name
)
const
;
};
sql/item_create.cc
View file @
9c960615
...
...
@@ -36,7 +36,6 @@
#include "sql_time.h"
#include "sql_type_geom.h"
#include <mysql/plugin_function.h>
#include <mysql/plugin_function_collection.h>
extern
"C"
uchar
*
...
...
@@ -49,80 +48,22 @@ get_native_fct_hash_key(const uchar *buff, size_t *length,
}
bool
Plugin_function_collection
::
init
()
bool
Native_func_registry_array
::
append_to_hash
(
HASH
*
hash
)
const
{
DBUG_ENTER
(
"Plugin_function_collection::init"
);
if
(
my_hash_init
(
&
m_hash
,
system_charset_info
,
(
ulong
)
m_native_func_registry_array
.
count
(),
0
,
0
,
(
my_hash_get_key
)
get_native_fct_hash_key
,
NULL
,
/* Nothing to free */
MYF
(
0
)))
DBUG_RETURN
(
true
);
for
(
size_t
i
=
0
;
i
<
m_native_func_registry_array
.
count
();
i
++
)
DBUG_ENTER
(
"Native_func_registry_array::append_to_hash"
);
for
(
size_t
i
=
0
;
i
<
count
();
i
++
)
{
const
Native_func_registry
&
func
=
m_native_func_registry_array
.
element
(
i
);
const
Native_func_registry
&
func
=
element
(
i
);
DBUG_ASSERT
(
func
.
builder
!=
NULL
);
if
(
my_hash_insert
(
&
m_
hash
,
(
uchar
*
)
&
func
))
if
(
my_hash_insert
(
hash
,
(
uchar
*
)
&
func
))
DBUG_RETURN
(
true
);
}
DBUG_RETURN
(
false
);
}
Create_func
*
Plugin_function_collection
::
find_native_function_builder
(
THD
*
thd
,
const
LEX_CSTRING
&
name
)
const
{
const
Native_func_registry
*
func
;
func
=
(
const
Native_func_registry
*
)
my_hash_search
(
&
m_hash
,
(
uchar
*
)
name
.
str
,
name
.
length
);
return
func
?
func
->
builder
:
NULL
;
}
class
Plugin_find_native_func_builder_param
{
bool
find_native_function_builder
(
THD
*
thd
,
const
Plugin_function_collection
*
pfc
)
{
// plugin_foreach() will stop iterating when this function returns TRUE
return
((
builder
=
pfc
->
find_native_function_builder
(
thd
,
name
)))
!=
NULL
;
}
static
my_bool
find_in_plugin
(
THD
*
thd
,
plugin_ref
plugin
,
void
*
data
)
{
Plugin_find_native_func_builder_param
*
param
=
reinterpret_cast
<
Plugin_find_native_func_builder_param
*>
(
data
);
const
Plugin_function_collection
*
fc
=
reinterpret_cast
<
Plugin_function_collection
*>
(
plugin_decl
(
plugin
)
->
info
);
return
param
->
find_native_function_builder
(
thd
,
fc
);
}
public:
LEX_CSTRING
name
;
Create_func
*
builder
;
Plugin_find_native_func_builder_param
(
const
LEX_CSTRING
&
name_arg
)
:
name
(
name_arg
),
builder
(
NULL
)
{
}
Create_func
*
find
(
THD
*
thd
)
{
if
(
!
plugin_foreach
(
thd
,
Plugin_find_native_func_builder_param
::
find_in_plugin
,
MariaDB_FUNCTION_COLLECTION_PLUGIN
,
this
))
return
NULL
;
return
builder
;
}
};
#ifdef HAVE_SPATIAL
extern
Plugin_function_collection
plugin_function_collection_geometry
;
extern
Native_func_registry_array
native_func_registry_array_geom
;
#endif
...
...
@@ -5633,11 +5574,12 @@ static Native_func_registry func_array[] =
{
{
STRING_WITH_LEN
(
"WSREP_LAST_SEEN_GTID"
)
},
BUILDER
(
Create_func_wsrep_last_seen_gtid
)},
{
{
STRING_WITH_LEN
(
"WSREP_SYNC_WAIT_UPTO_GTID"
)
},
BUILDER
(
Create_func_wsrep_sync_wait_upto
)},
#endif
/* WITH_WSREP */
{
{
STRING_WITH_LEN
(
"YEARWEEK"
)
},
BUILDER
(
Create_func_year_week
)},
{
{
0
,
0
},
NULL
}
{
{
STRING_WITH_LEN
(
"YEARWEEK"
)
},
BUILDER
(
Create_func_year_week
)}
};
Native_func_registry_array
native_func_registry_array
(
func_array
,
array_elements
(
func_array
));
static
HASH
native_functions_hash
;
/*
...
...
@@ -5649,10 +5591,13 @@ static HASH native_functions_hash;
int
item_create_init
()
{
DBUG_ENTER
(
"item_create_init"
);
size_t
count
=
native_func_registry_array
.
count
();
#ifdef HAVE_SPATIAL
count
+=
native_func_registry_array_geom
.
count
();
#endif
if
(
my_hash_init
(
&
native_functions_hash
,
system_charset_info
,
array_elements
(
func_array
)
,
(
ulong
)
count
,
0
,
0
,
(
my_hash_get_key
)
get_native_fct_hash_key
,
...
...
@@ -5660,17 +5605,33 @@ int item_create_init()
MYF
(
0
)))
DBUG_RETURN
(
1
);
if
(
item_create_append
(
func_array
))
if
(
native_func_registry_array
.
append_to_hash
(
&
native_functions_hash
))
DBUG_RETURN
(
1
);
#ifdef HAVE_SPATIAL
if
(
plugin_function_collection_geometry
.
init
(
))
if
(
native_func_registry_array_geom
.
append_to_hash
(
&
native_functions_hash
))
DBUG_RETURN
(
1
);
#endif
#ifndef DBUG_OFF
for
(
uint
i
=
0
;
i
<
native_functions_hash
.
records
;
i
++
)
{
Native_func_registry
*
func
;
func
=
(
Native_func_registry
*
)
my_hash_element
(
&
native_functions_hash
,
i
);
DBUG_PRINT
(
"info"
,
(
"native function: %s length: %u"
,
func
->
name
.
str
,
(
uint
)
func
->
name
.
length
));
}
#endif
DBUG_RETURN
(
0
);
}
/*
This function is used (dangerously) by plugin/versioning/versioning.cc
TODO: MDEV-20842 Wrap SQL functions defined in
plugin/versioning/versioning.cc into MariaDB_FUNCTION_PLUGIN
*/
int
item_create_append
(
Native_func_registry
array
[])
{
Native_func_registry
*
func
;
...
...
@@ -5683,15 +5644,6 @@ int item_create_append(Native_func_registry array[])
DBUG_RETURN
(
1
);
}
#ifndef DBUG_OFF
for
(
uint
i
=
0
;
i
<
native_functions_hash
.
records
;
i
++
)
{
func
=
(
Native_func_registry
*
)
my_hash_element
(
&
native_functions_hash
,
i
);
DBUG_PRINT
(
"info"
,
(
"native function: %s length: %u"
,
func
->
name
.
str
,
(
uint
)
func
->
name
.
length
));
}
#endif
DBUG_RETURN
(
0
);
}
...
...
@@ -5705,9 +5657,6 @@ void item_create_cleanup()
{
DBUG_ENTER
(
"item_create_cleanup"
);
my_hash_free
(
&
native_functions_hash
);
#ifdef HAVE_SPATIAL
plugin_function_collection_geometry
.
deinit
();
#endif
DBUG_VOID_RETURN
;
}
...
...
@@ -5746,16 +5695,7 @@ find_native_function_builder(THD *thd, const LEX_CSTRING *name)
if
((
builder
=
function_plugin_find_native_function_builder
(
thd
,
*
name
)))
return
builder
;
if
((
builder
=
Plugin_find_native_func_builder_param
(
*
name
).
find
(
thd
)))
return
builder
;
#ifdef HAVE_SPATIAL
if
(
!
builder
)
builder
=
plugin_function_collection_geometry
.
find_native_function_builder
(
thd
,
*
name
);
#endif
return
builder
;
return
NULL
;
}
Create_qfunc
*
...
...
sql/item_create.h
View file @
9c960615
...
...
@@ -315,5 +315,30 @@ Item *create_func_dyncol_get(THD *thd, Item *num, Item *str,
const
char
*
c_len
,
const
char
*
c_dec
,
CHARSET_INFO
*
cs
);
Item
*
create_func_dyncol_json
(
THD
*
thd
,
Item
*
str
);
class
Native_func_registry_array
{
const
Native_func_registry
*
m_elements
;
size_t
m_count
;
public:
Native_func_registry_array
()
:
m_elements
(
NULL
),
m_count
(
0
)
{
}
Native_func_registry_array
(
const
Native_func_registry
*
elements
,
size_t
count
)
:
m_elements
(
elements
),
m_count
(
count
)
{
}
const
Native_func_registry
&
element
(
size_t
i
)
const
{
DBUG_ASSERT
(
i
<
m_count
);
return
m_elements
[
i
];
}
size_t
count
()
const
{
return
m_count
;
}
bool
append_to_hash
(
HASH
*
hash
)
const
;
};
#endif
sql/item_geofunc.cc
View file @
9c960615
...
...
@@ -39,7 +39,7 @@
#include <m_ctype.h>
#include "opt_range.h"
#include "item_geofunc.h"
#include
<mysql/plugin_function_collection.h>
#include
"item_create.h"
bool
Item_geometry_func
::
fix_length_and_dec
()
...
...
@@ -3733,16 +3733,6 @@ Create_func_y Create_func_y::s_singleton;
/*************************************************************************/
class
FHash
:
public
HASH
{
public:
FHash
()
{
bzero
((
HASH
*
)
this
,
sizeof
(
HASH
));
}
};
#define GEOM_BUILDER(F) & F::s_singleton
...
...
@@ -3907,10 +3897,8 @@ static Native_func_registry func_array_geom[] =
};
Plugin_function_collection
plugin_function_collection_geometry
(
MariaDB_FUNCTION_COLLECTION_INTERFACE_VERSION
,
Native_func_registry_array
(
func_array_geom
,
array_elements
(
func_array_geom
)));
Native_func_registry_array
native_func_registry_array_geom
(
func_array_geom
,
array_elements
(
func_array_geom
));
#endif
/*HAVE_SPATIAL*/
sql/sql_plugin.cc
View file @
9c960615
...
...
@@ -40,7 +40,6 @@
#include <mysql/plugin_encryption.h>
#include <mysql/plugin_data_type.h>
#include <mysql/plugin_function.h>
#include <mysql/plugin_function_collection.h>
#include "sql_plugin_compat.h"
#ifdef HAVE_LINK_H
...
...
@@ -95,8 +94,7 @@ const LEX_CSTRING plugin_type_names[MYSQL_MAX_PLUGIN_TYPE_NUM]=
{
STRING_WITH_LEN
(
"PASSWORD VALIDATION"
)
},
{
STRING_WITH_LEN
(
"ENCRYPTION"
)
},
{
STRING_WITH_LEN
(
"DATA TYPE"
)
},
{
STRING_WITH_LEN
(
"FUNCTION"
)
},
{
STRING_WITH_LEN
(
"FUNCTION COLLECTION"
)
}
{
STRING_WITH_LEN
(
"FUNCTION"
)
}
};
extern
int
initialize_schema_table
(
st_plugin_int
*
plugin
);
...
...
@@ -117,16 +115,14 @@ plugin_type_init plugin_type_initialize[MYSQL_MAX_PLUGIN_TYPE_NUM]=
{
0
,
ha_initialize_handlerton
,
0
,
0
,
initialize_schema_table
,
initialize_audit_plugin
,
0
,
0
,
0
,
initialize_encryption_plugin
,
0
,
0
,
// FUNCTION
Plugin_function_collection
::
init_plugin
0
// FUNCTION
};
plugin_type_init
plugin_type_deinitialize
[
MYSQL_MAX_PLUGIN_TYPE_NUM
]
=
{
0
,
ha_finalize_handlerton
,
0
,
0
,
finalize_schema_table
,
finalize_audit_plugin
,
0
,
0
,
0
,
finalize_encryption_plugin
,
0
,
0
,
// FUNCTION
Plugin_function_collection
::
deinit_plugin
0
// FUNCTION
};
/*
...
...
@@ -140,7 +136,6 @@ static int plugin_type_initialization_order[MYSQL_MAX_PLUGIN_TYPE_NUM]=
MariaDB_ENCRYPTION_PLUGIN
,
MariaDB_DATA_TYPE_PLUGIN
,
MariaDB_FUNCTION_PLUGIN
,
MariaDB_FUNCTION_COLLECTION_PLUGIN
,
MYSQL_STORAGE_ENGINE_PLUGIN
,
MYSQL_INFORMATION_SCHEMA_PLUGIN
,
MYSQL_FTPARSER_PLUGIN
,
...
...
@@ -184,8 +179,7 @@ static int min_plugin_info_interface_version[MYSQL_MAX_PLUGIN_TYPE_NUM]=
MariaDB_PASSWORD_VALIDATION_INTERFACE_VERSION
,
MariaDB_ENCRYPTION_INTERFACE_VERSION
,
MariaDB_DATA_TYPE_INTERFACE_VERSION
,
MariaDB_FUNCTION_INTERFACE_VERSION
,
MariaDB_FUNCTION_COLLECTION_INTERFACE_VERSION
MariaDB_FUNCTION_INTERFACE_VERSION
};
static
int
cur_plugin_info_interface_version
[
MYSQL_MAX_PLUGIN_TYPE_NUM
]
=
{
...
...
@@ -200,8 +194,7 @@ static int cur_plugin_info_interface_version[MYSQL_MAX_PLUGIN_TYPE_NUM]=
MariaDB_PASSWORD_VALIDATION_INTERFACE_VERSION
,
MariaDB_ENCRYPTION_INTERFACE_VERSION
,
MariaDB_DATA_TYPE_INTERFACE_VERSION
,
MariaDB_FUNCTION_INTERFACE_VERSION
,
MariaDB_FUNCTION_COLLECTION_INTERFACE_VERSION
MariaDB_FUNCTION_INTERFACE_VERSION
};
static
struct
...
...
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