| 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 <my_global.h> |
| 18 | #include <sql_class.h> |
| 19 | #include <table.h> |
| 20 | #include <sql_show.h> |
| 21 | |
| 22 | |
| 23 | static const LEX_CSTRING result_types[]= |
| 24 | { |
| 25 | { STRING_WITH_LEN("VARCHAR" ) }, |
| 26 | { STRING_WITH_LEN("DOUBLE" ) }, |
| 27 | { STRING_WITH_LEN("INT" ) }, |
| 28 | { STRING_WITH_LEN("<IMPOSSIBLE1>" ) }, // ROW_RESULT |
| 29 | { STRING_WITH_LEN("DECIMAL" ) }, |
| 30 | { STRING_WITH_LEN("<IMPOSSIBLE2>" )} // TIME_RESULT |
| 31 | }; |
| 32 | |
| 33 | |
| 34 | static const LEX_CSTRING unsigned_result_types[]= |
| 35 | { |
| 36 | { STRING_WITH_LEN("<IMPOSSIBLE3>" ) }, // UNSIGNED STRING_RESULT |
| 37 | { STRING_WITH_LEN("DOUBLE UNSIGNED" ) }, |
| 38 | { STRING_WITH_LEN("INT UNSIGNED" ) }, |
| 39 | { STRING_WITH_LEN("<IMPOSSIBLE4>" ) }, // UNSIGNED ROW_RESULT |
| 40 | { STRING_WITH_LEN("DECIMAL UNSIGNED" ) }, |
| 41 | { STRING_WITH_LEN("<IMPOSSIBLE5>" ) } // UNSIGNED TIME_RESULT |
| 42 | }; |
| 43 | |
| 44 | |
| 45 | static ST_FIELD_INFO user_variables_fields_info[] = |
| 46 | { |
| 47 | { "VARIABLE_NAME" , NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, "Variable_name" , 0 }, |
| 48 | { "VARIABLE_VALUE" , 2048, MYSQL_TYPE_STRING, 0, MY_I_S_MAYBE_NULL, "Value" , 0 }, |
| 49 | { "VARIABLE_TYPE" , NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, 0, 0 }, |
| 50 | { "CHARACTER_SET_NAME" , MY_CS_NAME_SIZE, MYSQL_TYPE_STRING, 0, |
| 51 | MY_I_S_MAYBE_NULL, 0, 0 }, |
| 52 | { 0, 0, MYSQL_TYPE_NULL, 0, 0, 0, 0 } |
| 53 | }; |
| 54 | |
| 55 | |
| 56 | static int user_variables_fill(THD *thd, TABLE_LIST *tables, COND *cond) |
| 57 | { |
| 58 | ulong i; |
| 59 | TABLE *table= tables->table; |
| 60 | Field **field= table->field; |
| 61 | String buff; |
| 62 | bool is_null; |
| 63 | |
| 64 | for (i= 0; i < thd->user_vars.records; i++) |
| 65 | { |
| 66 | user_var_entry *var= (user_var_entry*) my_hash_element(&thd->user_vars, i); |
| 67 | |
| 68 | field[0]->store(var->name.str, var->name.length, system_charset_info); |
| 69 | |
| 70 | if (var->val_str(&is_null, &buff, NOT_FIXED_DEC)) |
| 71 | { |
| 72 | field[1]->store(buff.ptr(), buff.length(), buff.charset()); |
| 73 | field[1]->set_notnull(); |
| 74 | } |
| 75 | else if (is_null) |
| 76 | field[1]->set_null(); |
| 77 | else |
| 78 | return 1; |
| 79 | |
| 80 | const LEX_CSTRING *tmp= var->unsigned_flag ? |
| 81 | &unsigned_result_types[var->type] : |
| 82 | &result_types[var->type]; |
| 83 | field[2]->store(tmp->str, tmp->length, system_charset_info); |
| 84 | |
| 85 | if (var->charset()) |
| 86 | { |
| 87 | field[3]->store(var->charset()->csname, strlen(var->charset()->csname), |
| 88 | system_charset_info); |
| 89 | field[3]->set_notnull(); |
| 90 | } |
| 91 | else |
| 92 | field[3]->set_null(); |
| 93 | |
| 94 | if (schema_table_store_record(thd, table)) |
| 95 | return 1; |
| 96 | } |
| 97 | return 0; |
| 98 | } |
| 99 | |
| 100 | |
| 101 | int user_variables_reset(void) |
| 102 | { |
| 103 | THD *thd= current_thd; |
| 104 | if (thd) |
| 105 | my_hash_reset(&thd->user_vars); |
| 106 | return 0; |
| 107 | } |
| 108 | |
| 109 | |
| 110 | static int user_variables_init(void *p) |
| 111 | { |
| 112 | ST_SCHEMA_TABLE *is= (ST_SCHEMA_TABLE *) p; |
| 113 | is->fields_info= user_variables_fields_info; |
| 114 | is->fill_table= user_variables_fill; |
| 115 | is->reset_table= user_variables_reset; |
| 116 | return 0; |
| 117 | } |
| 118 | |
| 119 | |
| 120 | static struct st_mysql_information_schema user_variables_descriptor= |
| 121 | { MYSQL_INFORMATION_SCHEMA_INTERFACE_VERSION }; |
| 122 | |
| 123 | |
| 124 | maria_declare_plugin(user_variables) |
| 125 | { |
| 126 | MYSQL_INFORMATION_SCHEMA_PLUGIN, |
| 127 | &user_variables_descriptor, |
| 128 | "user_variables" , |
| 129 | "Sergey Vojtovich" , |
| 130 | "User-defined variables" , |
| 131 | PLUGIN_LICENSE_GPL, |
| 132 | user_variables_init, |
| 133 | NULL, |
| 134 | 0x0100, |
| 135 | NULL, |
| 136 | NULL, |
| 137 | "1.0" , |
| 138 | MariaDB_PLUGIN_MATURITY_GAMMA |
| 139 | } |
| 140 | maria_declare_plugin_end; |
| 141 | |