MDEV-7331 - information_schema.user_variables
This commit is contained in:
parent
d30ae14c24
commit
90c9641a8a
1
debian/mariadb-server-10.2.files.in
vendored
1
debian/mariadb-server-10.2.files.in
vendored
@ -19,6 +19,7 @@ usr/lib/mysql/plugin/server_audit.so
|
|||||||
usr/lib/mysql/plugin/simple_password_check.so
|
usr/lib/mysql/plugin/simple_password_check.so
|
||||||
usr/lib/mysql/plugin/sql_errlog.so
|
usr/lib/mysql/plugin/sql_errlog.so
|
||||||
usr/lib/mysql/plugin/wsrep_info.so
|
usr/lib/mysql/plugin/wsrep_info.so
|
||||||
|
usr/lib/mysql/plugin/user_variables.so
|
||||||
usr/lib/libhsclient.so.*
|
usr/lib/libhsclient.so.*
|
||||||
etc/apparmor.d/usr.sbin.mysqld
|
etc/apparmor.d/usr.sbin.mysqld
|
||||||
usr/share/apport/package-hooks/source_mariadb-10.2.py
|
usr/share/apport/package-hooks/source_mariadb-10.2.py
|
||||||
|
@ -31,7 +31,7 @@ perl;
|
|||||||
connect null-audit aria oqgraph sphinx thread-handling
|
connect null-audit aria oqgraph sphinx thread-handling
|
||||||
test-sql-discovery rpl-semi-sync query-cache-info
|
test-sql-discovery rpl-semi-sync query-cache-info
|
||||||
query-response-time metadata-lock-info locales unix-socket
|
query-response-time metadata-lock-info locales unix-socket
|
||||||
wsrep file-key-management/;
|
wsrep file-key-management user-variables/;
|
||||||
|
|
||||||
# And substitute the content some environment variables with their
|
# And substitute the content some environment variables with their
|
||||||
# names:
|
# names:
|
||||||
|
1
plugin/user_variables/CMakeLists.txt
Normal file
1
plugin/user_variables/CMakeLists.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
MYSQL_ADD_PLUGIN(user_variables user_variables.cc)
|
63
plugin/user_variables/mysql-test/user_variables/basic.result
Normal file
63
plugin/user_variables/mysql-test/user_variables/basic.result
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
SELECT PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_STATUS, PLUGIN_TYPE, PLUGIN_AUTHOR, PLUGIN_DESCRIPTION, PLUGIN_LICENSE, LOAD_OPTION, PLUGIN_MATURITY FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME='user_variables';
|
||||||
|
PLUGIN_NAME user_variables
|
||||||
|
PLUGIN_VERSION 1.0
|
||||||
|
PLUGIN_STATUS ACTIVE
|
||||||
|
PLUGIN_TYPE INFORMATION SCHEMA
|
||||||
|
PLUGIN_AUTHOR Sergey Vojtovich
|
||||||
|
PLUGIN_DESCRIPTION User-defined variables
|
||||||
|
PLUGIN_LICENSE GPL
|
||||||
|
LOAD_OPTION ON
|
||||||
|
PLUGIN_MATURITY Alpha
|
||||||
|
SHOW CREATE TABLE INFORMATION_SCHEMA.USER_VARIABLES;
|
||||||
|
Table Create Table
|
||||||
|
user_variables CREATE TEMPORARY TABLE `user_variables` (
|
||||||
|
`VARIABLE_NAME` varchar(64) NOT NULL DEFAULT '',
|
||||||
|
`VARIABLE_VALUE` varchar(2048) DEFAULT NULL,
|
||||||
|
`VARIABLE_TYPE` varchar(64) NOT NULL DEFAULT '',
|
||||||
|
`CHARACTER_SET_NAME` varchar(32) DEFAULT NULL
|
||||||
|
) ENGINE=MEMORY DEFAULT CHARSET=utf8
|
||||||
|
FLUSH USER_VARIABLES;
|
||||||
|
SELECT COUNT(*) FROM INFORMATION_SCHEMA.USER_VARIABLES;
|
||||||
|
COUNT(*)
|
||||||
|
0
|
||||||
|
SET @int_var=1;
|
||||||
|
SET @uint_var=CAST(2 AS UNSIGNED INTEGER);
|
||||||
|
SET @str_var='Value of string variable';
|
||||||
|
SET @utf8str_var=_utf8 'UTF8 string value';
|
||||||
|
SET @double_var=CAST(1 AS DOUBLE);
|
||||||
|
SET @dec_var=CAST(1 AS DECIMAL(20, 10));
|
||||||
|
SET @time_var=CAST('2016-02-25' AS DATE);
|
||||||
|
SET @' @#^%'='Value of variable with odd name';
|
||||||
|
SET @''='Value of variable with empty name';
|
||||||
|
SET @null_var=NULL;
|
||||||
|
SELECT COUNT(*) FROM INFORMATION_SCHEMA.USER_VARIABLES;
|
||||||
|
COUNT(*)
|
||||||
|
10
|
||||||
|
SELECT * FROM INFORMATION_SCHEMA.USER_VARIABLES ORDER BY VARIABLE_NAME;
|
||||||
|
VARIABLE_NAME VARIABLE_VALUE VARIABLE_TYPE CHARACTER_SET_NAME
|
||||||
|
Value of variable with empty name VARCHAR latin1
|
||||||
|
@#^% Value of variable with odd name VARCHAR latin1
|
||||||
|
dec_var 1.0000000000 DECIMAL latin1
|
||||||
|
double_var 1 DOUBLE latin1
|
||||||
|
int_var 1 INT latin1
|
||||||
|
null_var NULL VARCHAR binary
|
||||||
|
str_var Value of string variable VARCHAR latin1
|
||||||
|
time_var 2016-02-25 VARCHAR latin1
|
||||||
|
uint_var 2 INT UNSIGNED latin1
|
||||||
|
utf8str_var UTF8 string value VARCHAR utf8
|
||||||
|
SHOW USER_VARIABLES;
|
||||||
|
Variable_name Value
|
||||||
|
Value of variable with empty name
|
||||||
|
@#^% Value of variable with odd name
|
||||||
|
dec_var 1.0000000000
|
||||||
|
double_var 1
|
||||||
|
int_var 1
|
||||||
|
null_var NULL
|
||||||
|
str_var Value of string variable
|
||||||
|
time_var 2016-02-25
|
||||||
|
uint_var 2
|
||||||
|
utf8str_var UTF8 string value
|
||||||
|
FLUSH USER_VARIABLES;
|
||||||
|
SELECT COUNT(*) FROM INFORMATION_SCHEMA.USER_VARIABLES;
|
||||||
|
COUNT(*)
|
||||||
|
0
|
24
plugin/user_variables/mysql-test/user_variables/basic.test
Normal file
24
plugin/user_variables/mysql-test/user_variables/basic.test
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
query_vertical SELECT PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_STATUS, PLUGIN_TYPE, PLUGIN_AUTHOR, PLUGIN_DESCRIPTION, PLUGIN_LICENSE, LOAD_OPTION, PLUGIN_MATURITY FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME='user_variables';
|
||||||
|
SHOW CREATE TABLE INFORMATION_SCHEMA.USER_VARIABLES;
|
||||||
|
|
||||||
|
FLUSH USER_VARIABLES;
|
||||||
|
SELECT COUNT(*) FROM INFORMATION_SCHEMA.USER_VARIABLES;
|
||||||
|
|
||||||
|
SET @int_var=1;
|
||||||
|
SET @uint_var=CAST(2 AS UNSIGNED INTEGER);
|
||||||
|
SET @str_var='Value of string variable';
|
||||||
|
SET @utf8str_var=_utf8 'UTF8 string value';
|
||||||
|
SET @double_var=CAST(1 AS DOUBLE);
|
||||||
|
SET @dec_var=CAST(1 AS DECIMAL(20, 10));
|
||||||
|
SET @time_var=CAST('2016-02-25' AS DATE);
|
||||||
|
SET @' @#^%'='Value of variable with odd name';
|
||||||
|
SET @''='Value of variable with empty name';
|
||||||
|
SET @null_var=NULL;
|
||||||
|
|
||||||
|
SELECT COUNT(*) FROM INFORMATION_SCHEMA.USER_VARIABLES;
|
||||||
|
SELECT * FROM INFORMATION_SCHEMA.USER_VARIABLES ORDER BY VARIABLE_NAME;
|
||||||
|
--sorted_result
|
||||||
|
SHOW USER_VARIABLES;
|
||||||
|
|
||||||
|
FLUSH USER_VARIABLES;
|
||||||
|
SELECT COUNT(*) FROM INFORMATION_SCHEMA.USER_VARIABLES;
|
@ -0,0 +1 @@
|
|||||||
|
--plugin-load-add=$USER_VARIABLES_SO --plugin-user-variables=ON
|
13
plugin/user_variables/mysql-test/user_variables/suite.pm
Normal file
13
plugin/user_variables/mysql-test/user_variables/suite.pm
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
package My::Suite::User_variables;
|
||||||
|
|
||||||
|
@ISA = qw(My::Suite);
|
||||||
|
|
||||||
|
return "No USER_VARIABLES plugin" unless
|
||||||
|
$ENV{USER_VARIABLES_SO} or
|
||||||
|
$::mysqld_variables{'user-variables'} eq "ON";
|
||||||
|
|
||||||
|
return "Not run for embedded server" if $::opt_embedded_server;
|
||||||
|
|
||||||
|
sub is_default { 1 }
|
||||||
|
|
||||||
|
bless { };
|
139
plugin/user_variables/user_variables.cc
Normal file
139
plugin/user_variables/user_variables.cc
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
/* Copyright (C) 2016 MariaDB Foundation and Sergey Vojtovich
|
||||||
|
|
||||||
|
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||||
|
|
||||||
|
#define MYSQL_SERVER
|
||||||
|
#include <sql_class.h>
|
||||||
|
#include <table.h>
|
||||||
|
#include <sql_show.h>
|
||||||
|
|
||||||
|
|
||||||
|
static const LEX_CSTRING result_types[]=
|
||||||
|
{
|
||||||
|
STRING_WITH_LEN("VARCHAR"),
|
||||||
|
STRING_WITH_LEN("DOUBLE"),
|
||||||
|
STRING_WITH_LEN("INT"),
|
||||||
|
STRING_WITH_LEN("<IMPOSSIBLE1>"), // ROW_RESULT
|
||||||
|
STRING_WITH_LEN("DECIMAL"),
|
||||||
|
STRING_WITH_LEN("<IMPOSSIBLE2>") // TIME_RESULT
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static const LEX_CSTRING unsigned_result_types[]=
|
||||||
|
{
|
||||||
|
STRING_WITH_LEN("<IMPOSSIBLE3>"), // UNSIGNED STRING_RESULT
|
||||||
|
STRING_WITH_LEN("DOUBLE UNSIGNED"),
|
||||||
|
STRING_WITH_LEN("INT UNSIGNED"),
|
||||||
|
STRING_WITH_LEN("<IMPOSSIBLE4>"), // UNSIGNED ROW_RESULT
|
||||||
|
STRING_WITH_LEN("DECIMAL UNSIGNED"),
|
||||||
|
STRING_WITH_LEN("<IMPOSSIBLE5>") // UNSIGNED TIME_RESULT
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static ST_FIELD_INFO user_variables_fields_info[] =
|
||||||
|
{
|
||||||
|
{ "VARIABLE_NAME", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, "Variable_name", 0 },
|
||||||
|
{ "VARIABLE_VALUE", 2048, MYSQL_TYPE_STRING, 0, MY_I_S_MAYBE_NULL, "Value", 0 },
|
||||||
|
{ "VARIABLE_TYPE", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, 0, 0 },
|
||||||
|
{ "CHARACTER_SET_NAME", MY_CS_NAME_SIZE, MYSQL_TYPE_STRING, 0,
|
||||||
|
MY_I_S_MAYBE_NULL, 0, 0 },
|
||||||
|
{ 0, 0, MYSQL_TYPE_NULL, 0, 0, 0, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static int user_variables_fill(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||||
|
{
|
||||||
|
ulong i;
|
||||||
|
TABLE *table= tables->table;
|
||||||
|
Field **field= table->field;
|
||||||
|
String buff;
|
||||||
|
bool is_null;
|
||||||
|
|
||||||
|
for (i= 0; i < thd->user_vars.records; i++)
|
||||||
|
{
|
||||||
|
user_var_entry *var= (user_var_entry*) my_hash_element(&thd->user_vars, i);
|
||||||
|
|
||||||
|
field[0]->store(var->name.str, var->name.length, system_charset_info);
|
||||||
|
|
||||||
|
if (var->val_str(&is_null, &buff, NOT_FIXED_DEC))
|
||||||
|
{
|
||||||
|
field[1]->store(buff.ptr(), buff.length(), buff.charset());
|
||||||
|
field[1]->set_notnull();
|
||||||
|
}
|
||||||
|
else if (is_null)
|
||||||
|
field[1]->set_null();
|
||||||
|
else
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
const LEX_CSTRING *tmp= var->unsigned_flag ?
|
||||||
|
&unsigned_result_types[var->type] :
|
||||||
|
&result_types[var->type];
|
||||||
|
field[2]->store(tmp->str, tmp->length, system_charset_info);
|
||||||
|
|
||||||
|
if (var->charset())
|
||||||
|
{
|
||||||
|
field[3]->store(var->charset()->csname, strlen(var->charset()->csname),
|
||||||
|
system_charset_info);
|
||||||
|
field[3]->set_notnull();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
field[3]->set_null();
|
||||||
|
|
||||||
|
if (schema_table_store_record(thd, table))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int user_variables_reset(void)
|
||||||
|
{
|
||||||
|
THD *thd= current_thd;
|
||||||
|
if (thd)
|
||||||
|
my_hash_reset(&thd->user_vars);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int user_variables_init(void *p)
|
||||||
|
{
|
||||||
|
ST_SCHEMA_TABLE *is= (ST_SCHEMA_TABLE *) p;
|
||||||
|
is->fields_info= user_variables_fields_info;
|
||||||
|
is->fill_table= user_variables_fill;
|
||||||
|
is->reset_table= user_variables_reset;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static struct st_mysql_information_schema user_variables_descriptor=
|
||||||
|
{ MYSQL_INFORMATION_SCHEMA_INTERFACE_VERSION };
|
||||||
|
|
||||||
|
|
||||||
|
maria_declare_plugin(user_variables)
|
||||||
|
{
|
||||||
|
MYSQL_INFORMATION_SCHEMA_PLUGIN,
|
||||||
|
&user_variables_descriptor,
|
||||||
|
"user_variables",
|
||||||
|
"Sergey Vojtovich",
|
||||||
|
"User-defined variables",
|
||||||
|
PLUGIN_LICENSE_GPL,
|
||||||
|
user_variables_init,
|
||||||
|
NULL,
|
||||||
|
0x0100,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
"1.0",
|
||||||
|
MariaDB_PLUGIN_MATURITY_ALPHA
|
||||||
|
}
|
||||||
|
maria_declare_plugin_end;
|
Loading…
x
Reference in New Issue
Block a user