Skip to content

Commit 90c9641

Browse files
committed
MDEV-7331 - information_schema.user_variables
1 parent d30ae14 commit 90c9641

File tree

8 files changed

+243
-1
lines changed

8 files changed

+243
-1
lines changed

debian/mariadb-server-10.2.files.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ usr/lib/mysql/plugin/server_audit.so
1919
usr/lib/mysql/plugin/simple_password_check.so
2020
usr/lib/mysql/plugin/sql_errlog.so
2121
usr/lib/mysql/plugin/wsrep_info.so
22+
usr/lib/mysql/plugin/user_variables.so
2223
usr/lib/libhsclient.so.*
2324
etc/apparmor.d/usr.sbin.mysqld
2425
usr/share/apport/package-hooks/source_mariadb-10.2.py

mysql-test/t/mysqld--help.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ perl;
3131
connect null-audit aria oqgraph sphinx thread-handling
3232
test-sql-discovery rpl-semi-sync query-cache-info
3333
query-response-time metadata-lock-info locales unix-socket
34-
wsrep file-key-management/;
34+
wsrep file-key-management user-variables/;
3535

3636
# And substitute the content some environment variables with their
3737
# names:

plugin/user_variables/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
MYSQL_ADD_PLUGIN(user_variables user_variables.cc)
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
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';
2+
PLUGIN_NAME user_variables
3+
PLUGIN_VERSION 1.0
4+
PLUGIN_STATUS ACTIVE
5+
PLUGIN_TYPE INFORMATION SCHEMA
6+
PLUGIN_AUTHOR Sergey Vojtovich
7+
PLUGIN_DESCRIPTION User-defined variables
8+
PLUGIN_LICENSE GPL
9+
LOAD_OPTION ON
10+
PLUGIN_MATURITY Alpha
11+
SHOW CREATE TABLE INFORMATION_SCHEMA.USER_VARIABLES;
12+
Table Create Table
13+
user_variables CREATE TEMPORARY TABLE `user_variables` (
14+
`VARIABLE_NAME` varchar(64) NOT NULL DEFAULT '',
15+
`VARIABLE_VALUE` varchar(2048) DEFAULT NULL,
16+
`VARIABLE_TYPE` varchar(64) NOT NULL DEFAULT '',
17+
`CHARACTER_SET_NAME` varchar(32) DEFAULT NULL
18+
) ENGINE=MEMORY DEFAULT CHARSET=utf8
19+
FLUSH USER_VARIABLES;
20+
SELECT COUNT(*) FROM INFORMATION_SCHEMA.USER_VARIABLES;
21+
COUNT(*)
22+
0
23+
SET @int_var=1;
24+
SET @uint_var=CAST(2 AS UNSIGNED INTEGER);
25+
SET @str_var='Value of string variable';
26+
SET @utf8str_var=_utf8 'UTF8 string value';
27+
SET @double_var=CAST(1 AS DOUBLE);
28+
SET @dec_var=CAST(1 AS DECIMAL(20, 10));
29+
SET @time_var=CAST('2016-02-25' AS DATE);
30+
SET @' @#^%'='Value of variable with odd name';
31+
SET @''='Value of variable with empty name';
32+
SET @null_var=NULL;
33+
SELECT COUNT(*) FROM INFORMATION_SCHEMA.USER_VARIABLES;
34+
COUNT(*)
35+
10
36+
SELECT * FROM INFORMATION_SCHEMA.USER_VARIABLES ORDER BY VARIABLE_NAME;
37+
VARIABLE_NAME VARIABLE_VALUE VARIABLE_TYPE CHARACTER_SET_NAME
38+
Value of variable with empty name VARCHAR latin1
39+
@#^% Value of variable with odd name VARCHAR latin1
40+
dec_var 1.0000000000 DECIMAL latin1
41+
double_var 1 DOUBLE latin1
42+
int_var 1 INT latin1
43+
null_var NULL VARCHAR binary
44+
str_var Value of string variable VARCHAR latin1
45+
time_var 2016-02-25 VARCHAR latin1
46+
uint_var 2 INT UNSIGNED latin1
47+
utf8str_var UTF8 string value VARCHAR utf8
48+
SHOW USER_VARIABLES;
49+
Variable_name Value
50+
Value of variable with empty name
51+
@#^% Value of variable with odd name
52+
dec_var 1.0000000000
53+
double_var 1
54+
int_var 1
55+
null_var NULL
56+
str_var Value of string variable
57+
time_var 2016-02-25
58+
uint_var 2
59+
utf8str_var UTF8 string value
60+
FLUSH USER_VARIABLES;
61+
SELECT COUNT(*) FROM INFORMATION_SCHEMA.USER_VARIABLES;
62+
COUNT(*)
63+
0
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
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';
2+
SHOW CREATE TABLE INFORMATION_SCHEMA.USER_VARIABLES;
3+
4+
FLUSH USER_VARIABLES;
5+
SELECT COUNT(*) FROM INFORMATION_SCHEMA.USER_VARIABLES;
6+
7+
SET @int_var=1;
8+
SET @uint_var=CAST(2 AS UNSIGNED INTEGER);
9+
SET @str_var='Value of string variable';
10+
SET @utf8str_var=_utf8 'UTF8 string value';
11+
SET @double_var=CAST(1 AS DOUBLE);
12+
SET @dec_var=CAST(1 AS DECIMAL(20, 10));
13+
SET @time_var=CAST('2016-02-25' AS DATE);
14+
SET @' @#^%'='Value of variable with odd name';
15+
SET @''='Value of variable with empty name';
16+
SET @null_var=NULL;
17+
18+
SELECT COUNT(*) FROM INFORMATION_SCHEMA.USER_VARIABLES;
19+
SELECT * FROM INFORMATION_SCHEMA.USER_VARIABLES ORDER BY VARIABLE_NAME;
20+
--sorted_result
21+
SHOW USER_VARIABLES;
22+
23+
FLUSH USER_VARIABLES;
24+
SELECT COUNT(*) FROM INFORMATION_SCHEMA.USER_VARIABLES;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
--plugin-load-add=$USER_VARIABLES_SO --plugin-user-variables=ON
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package My::Suite::User_variables;
2+
3+
@ISA = qw(My::Suite);
4+
5+
return "No USER_VARIABLES plugin" unless
6+
$ENV{USER_VARIABLES_SO} or
7+
$::mysqld_variables{'user-variables'} eq "ON";
8+
9+
return "Not run for embedded server" if $::opt_embedded_server;
10+
11+
sub is_default { 1 }
12+
13+
bless { };
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
/* Copyright (C) 2016 MariaDB Foundation and Sergey Vojtovich
2+
3+
This program is free software; you can redistribute it and/or modify
4+
it under the terms of the GNU General Public License as published by
5+
the Free Software Foundation; version 2 of the License.
6+
7+
This program is distributed in the hope that it will be useful,
8+
but WITHOUT ANY WARRANTY; without even the implied warranty of
9+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10+
GNU General Public License for more details.
11+
12+
You should have received a copy of the GNU General Public License
13+
along with this program; if not, write to the Free Software
14+
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
15+
16+
#define MYSQL_SERVER
17+
#include <sql_class.h>
18+
#include <table.h>
19+
#include <sql_show.h>
20+
21+
22+
static const LEX_CSTRING result_types[]=
23+
{
24+
STRING_WITH_LEN("VARCHAR"),
25+
STRING_WITH_LEN("DOUBLE"),
26+
STRING_WITH_LEN("INT"),
27+
STRING_WITH_LEN("<IMPOSSIBLE1>"), // ROW_RESULT
28+
STRING_WITH_LEN("DECIMAL"),
29+
STRING_WITH_LEN("<IMPOSSIBLE2>") // TIME_RESULT
30+
};
31+
32+
33+
static const LEX_CSTRING unsigned_result_types[]=
34+
{
35+
STRING_WITH_LEN("<IMPOSSIBLE3>"), // UNSIGNED STRING_RESULT
36+
STRING_WITH_LEN("DOUBLE UNSIGNED"),
37+
STRING_WITH_LEN("INT UNSIGNED"),
38+
STRING_WITH_LEN("<IMPOSSIBLE4>"), // UNSIGNED ROW_RESULT
39+
STRING_WITH_LEN("DECIMAL UNSIGNED"),
40+
STRING_WITH_LEN("<IMPOSSIBLE5>") // UNSIGNED TIME_RESULT
41+
};
42+
43+
44+
static ST_FIELD_INFO user_variables_fields_info[] =
45+
{
46+
{ "VARIABLE_NAME", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, "Variable_name", 0 },
47+
{ "VARIABLE_VALUE", 2048, MYSQL_TYPE_STRING, 0, MY_I_S_MAYBE_NULL, "Value", 0 },
48+
{ "VARIABLE_TYPE", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, 0, 0 },
49+
{ "CHARACTER_SET_NAME", MY_CS_NAME_SIZE, MYSQL_TYPE_STRING, 0,
50+
MY_I_S_MAYBE_NULL, 0, 0 },
51+
{ 0, 0, MYSQL_TYPE_NULL, 0, 0, 0, 0 }
52+
};
53+
54+
55+
static int user_variables_fill(THD *thd, TABLE_LIST *tables, COND *cond)
56+
{
57+
ulong i;
58+
TABLE *table= tables->table;
59+
Field **field= table->field;
60+
String buff;
61+
bool is_null;
62+
63+
for (i= 0; i < thd->user_vars.records; i++)
64+
{
65+
user_var_entry *var= (user_var_entry*) my_hash_element(&thd->user_vars, i);
66+
67+
field[0]->store(var->name.str, var->name.length, system_charset_info);
68+
69+
if (var->val_str(&is_null, &buff, NOT_FIXED_DEC))
70+
{
71+
field[1]->store(buff.ptr(), buff.length(), buff.charset());
72+
field[1]->set_notnull();
73+
}
74+
else if (is_null)
75+
field[1]->set_null();
76+
else
77+
return 1;
78+
79+
const LEX_CSTRING *tmp= var->unsigned_flag ?
80+
&unsigned_result_types[var->type] :
81+
&result_types[var->type];
82+
field[2]->store(tmp->str, tmp->length, system_charset_info);
83+
84+
if (var->charset())
85+
{
86+
field[3]->store(var->charset()->csname, strlen(var->charset()->csname),
87+
system_charset_info);
88+
field[3]->set_notnull();
89+
}
90+
else
91+
field[3]->set_null();
92+
93+
if (schema_table_store_record(thd, table))
94+
return 1;
95+
}
96+
return 0;
97+
}
98+
99+
100+
int user_variables_reset(void)
101+
{
102+
THD *thd= current_thd;
103+
if (thd)
104+
my_hash_reset(&thd->user_vars);
105+
return 0;
106+
}
107+
108+
109+
static int user_variables_init(void *p)
110+
{
111+
ST_SCHEMA_TABLE *is= (ST_SCHEMA_TABLE *) p;
112+
is->fields_info= user_variables_fields_info;
113+
is->fill_table= user_variables_fill;
114+
is->reset_table= user_variables_reset;
115+
return 0;
116+
}
117+
118+
119+
static struct st_mysql_information_schema user_variables_descriptor=
120+
{ MYSQL_INFORMATION_SCHEMA_INTERFACE_VERSION };
121+
122+
123+
maria_declare_plugin(user_variables)
124+
{
125+
MYSQL_INFORMATION_SCHEMA_PLUGIN,
126+
&user_variables_descriptor,
127+
"user_variables",
128+
"Sergey Vojtovich",
129+
"User-defined variables",
130+
PLUGIN_LICENSE_GPL,
131+
user_variables_init,
132+
NULL,
133+
0x0100,
134+
NULL,
135+
NULL,
136+
"1.0",
137+
MariaDB_PLUGIN_MATURITY_ALPHA
138+
}
139+
maria_declare_plugin_end;

0 commit comments

Comments
 (0)