diff options
author | Alexander Barkov <bar@mariadb.com> | 2020-03-10 16:05:42 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.com> | 2020-03-10 20:43:32 +0400 |
commit | e40858a7bdc65be4386a9e74262731fae964958b (patch) | |
tree | 184b48fea049e6e7ca4763480e6d6a7bd1ff9abd /client | |
parent | 00749980acf617fbc26b5cdaff6e256a673dab76 (diff) | |
download | mariadb-git-e40858a7bdc65be4386a9e74262731fae964958b.tar.gz |
MDEV-17832 Protocol: extensions for Pluggable types and JSON, GEOMETRY
Diffstat (limited to 'client')
-rw-r--r-- | client/CMakeLists.txt | 4 | ||||
-rw-r--r-- | client/client_metadata.h | 57 | ||||
-rw-r--r-- | client/mysql.cc | 9 | ||||
-rw-r--r-- | client/mysqltest.cc | 12 |
4 files changed, 80 insertions, 2 deletions
diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index dfa805fc7e8..0f63f58e5da 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -44,7 +44,9 @@ IF(UNIX) SET_TARGET_PROPERTIES(mysql PROPERTIES ENABLE_EXPORTS TRUE) ENDIF(UNIX) -MYSQL_ADD_EXECUTABLE(mysqltest mysqltest.cc COMPONENT Test) +MYSQL_ADD_EXECUTABLE(mysqltest mysqltest.cc + ${CMAKE_SOURCE_DIR}/sql/sql_string.cc + COMPONENT Test) SET_SOURCE_FILES_PROPERTIES(mysqltest.cc PROPERTIES COMPILE_FLAGS "-DTHREADS ${PCRE2_DEBIAN_HACK}") TARGET_LINK_LIBRARIES(mysqltest ${CLIENT_LIB} pcre2-posix pcre2-8) SET_TARGET_PROPERTIES(mysqltest PROPERTIES ENABLE_EXPORTS TRUE) diff --git a/client/client_metadata.h b/client/client_metadata.h new file mode 100644 index 00000000000..49921f01885 --- /dev/null +++ b/client/client_metadata.h @@ -0,0 +1,57 @@ +#ifndef SQL_CLIENT_METADATA_INCLUDED +#define SQL_CLIENT_METADATA_INCLUDED +/* + Copyright (c) 2020, MariaDB Corporation. + + 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 */ + +#include "sql_string.h" + + +/* + Print MYSQL_FIELD metadata in human readable format +*/ +class Client_field_metadata +{ + const MYSQL_FIELD *m_field; +public: + Client_field_metadata(MYSQL_FIELD *field) + :m_field(field) + { } + void print_attr(Binary_string *to, + const LEX_CSTRING &name, + mariadb_field_attr_t attr, + uint orig_to_length) const + { + MARIADB_CONST_STRING tmp; + if (!mariadb_field_attr(&tmp, m_field, attr) && tmp.length) + { + if (to->length() != orig_to_length) + to->append(" ", 1); + to->append(name); + to->append(tmp.str, tmp.length); + } + } + void print_data_type_related_attributes(Binary_string *to) const + { + static const LEX_CSTRING type= {C_STRING_WITH_LEN("type=")}; + static const LEX_CSTRING format= {C_STRING_WITH_LEN("format=")}; + uint to_length_orig= to->length(); + print_attr(to, type, MARIADB_FIELD_ATTR_DATA_TYPE_NAME, to_length_orig); + print_attr(to, format, MARIADB_FIELD_ATTR_FORMAT_NAME, to_length_orig); + } +}; + + +#endif // SQL_CLIENT_METADATA_INCLUDED diff --git a/client/mysql.cc b/client/mysql.cc index 2c7f0a500b9..c30139cd96b 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -58,6 +58,7 @@ static char *server_version= NULL; #define MAX_SERVER_ARGS 64 #include "sql_string.h" +#include "client_metadata.h" extern "C" { #if defined(HAVE_CURSES_H) && defined(HAVE_TERM_H) @@ -3513,12 +3514,15 @@ print_field_types(MYSQL_RES *result) while ((field = mysql_fetch_field(result))) { + Client_field_metadata metadata(field); + BinaryStringBuffer<128> data_type_metadata_str; + metadata.print_data_type_related_attributes(&data_type_metadata_str); tee_fprintf(PAGER, "Field %3u: `%s`\n" "Catalog: `%s`\n" "Database: `%s`\n" "Table: `%s`\n" "Org_table: `%s`\n" - "Type: %s\n" + "Type: %s%s%.*s%s\n" "Collation: %s (%u)\n" "Length: %lu\n" "Max_length: %lu\n" @@ -3527,6 +3531,9 @@ print_field_types(MYSQL_RES *result) ++i, field->name, field->catalog, field->db, field->table, field->org_table, fieldtype2str(field->type), + data_type_metadata_str.length() ? " (" : "", + data_type_metadata_str.length(), data_type_metadata_str.ptr(), + data_type_metadata_str.length() ? ")" : "", get_charset_name(field->charsetnr), field->charsetnr, field->length, field->max_length, field->decimals, fieldflags2str(field->flags)); diff --git a/client/mysqltest.cc b/client/mysqltest.cc index 148a492a648..910db0f714e 100644 --- a/client/mysqltest.cc +++ b/client/mysqltest.cc @@ -40,6 +40,7 @@ #include <mysqld_error.h> #include <sql_common.h> #include <m_ctype.h> +#include "client_metadata.h" #include <my_dir.h> #include <hash.h> #include <stdarg.h> @@ -7709,6 +7710,17 @@ void append_metadata(DYNAMIC_STRING *ds, dynstr_append_mem(ds, field->name, field->name_length); dynstr_append_mem(ds, "\t", 1); replace_dynstr_append_uint(ds, field->type); + + Client_field_metadata metadata(field); + BinaryStringBuffer<128> data_type_metadata_str; + metadata.print_data_type_related_attributes(&data_type_metadata_str); + if (data_type_metadata_str.length()) + { + dynstr_append_mem(ds, " (", 2); + dynstr_append_mem(ds, data_type_metadata_str.ptr(), + data_type_metadata_str.length()); + dynstr_append_mem(ds, ")", 1); + } dynstr_append_mem(ds, "\t", 1); replace_dynstr_append_uint(ds, field->length); dynstr_append_mem(ds, "\t", 1); |