From 971055a4739e96fceefba93cac7f3f7d580323e6 Mon Sep 17 00:00:00 2001 From: Roman Nozdrin Date: Thu, 27 Dec 2018 11:38:56 +0300 Subject: [PATCH] MCOL-1101. PoC for INFINIDB_VTABLE and thd variables migration to plugin sys variables. --- dbcon/mysql/CMakeLists.txt | 1 + dbcon/mysql/ha_calpont.cpp | 111 ++++++++++++++++--------------- dbcon/mysql/ha_calpont.h | 24 +------ dbcon/mysql/ha_calpont_ddl.cpp | 9 +-- dbcon/mysql/ha_calpont_impl.cpp | 14 +++- dbcon/mysql/ha_calpont_impl.h | 8 +-- dbcon/mysql/ha_calpont_impl_if.h | 2 - 7 files changed, 80 insertions(+), 89 deletions(-) diff --git a/dbcon/mysql/CMakeLists.txt b/dbcon/mysql/CMakeLists.txt index ae8f30622..b9af67200 100644 --- a/dbcon/mysql/CMakeLists.txt +++ b/dbcon/mysql/CMakeLists.txt @@ -4,6 +4,7 @@ include_directories( ${ENGINE_COMMON_INCLUDES} SET ( libcalmysql_SRCS + mcs_sysvars.cpp ha_calpont.cpp ha_calpont_impl.cpp ha_calpont_dml.cpp diff --git a/dbcon/mysql/ha_calpont.cpp b/dbcon/mysql/ha_calpont.cpp index 6ea5f85a6..b709a923d 100644 --- a/dbcon/mysql/ha_calpont.cpp +++ b/dbcon/mysql/ha_calpont.cpp @@ -380,6 +380,7 @@ static int calpont_close_connection ( handlerton* hton, THD* thd ) ha_calpont::ha_calpont(handlerton* hton, TABLE_SHARE* table_arg) : handler(hton, table_arg), + fe_conn_info(NULL), int_table_flags(HA_BINLOG_STMT_CAPABLE | HA_BINLOG_ROW_CAPABLE | HA_TABLE_SCAN_ON_INDEX | HA_CAN_TABLE_CONDITION_PUSHDOWN) @@ -683,7 +684,11 @@ int ha_calpont::rnd_init(bool scan) { DBUG_ENTER("ha_calpont::rnd_init"); - int rc = ha_calpont_impl_rnd_init(table); + // Use global THD* + set_original_query(current_thd, current_thd->query_string.str()); + mcs_handler_info mhi(static_cast(this), LEGACY); + + int rc = ha_calpont_impl_rnd_init(table, mhi); DBUG_RETURN(rc); } @@ -1101,44 +1106,6 @@ struct st_mysql_storage_engine columnstore_storage_engine = struct st_mysql_storage_engine infinidb_storage_engine = { MYSQL_HANDLERTON_INTERFACE_VERSION }; -#if 0 -static ulong srv_enum_var = 0; -static ulong srv_ulong_var = 0; - -const char* enum_var_names[] = -{ - "e1", "e2", NullS -}; - -TYPELIB enum_var_typelib = -{ - array_elements(enum_var_names) - 1, "enum_var_typelib", - enum_var_names, NULL -}; - -static MYSQL_SYSVAR_ENUM( - enum_var, // name - srv_enum_var, // varname - PLUGIN_VAR_RQCMDARG, // opt - "Sample ENUM system variable.", // comment - NULL, // check - NULL, // update - 0, // def - &enum_var_typelib); // typelib - -static MYSQL_SYSVAR_ULONG( - ulong_var, - srv_ulong_var, - PLUGIN_VAR_RQCMDARG, - "0..1000", - NULL, - NULL, - 8, - 0, - 1000, - 0); -#endif - /*@brief check_walk - It traverses filter conditions*/ /************************************************************ * DESCRIPTION: @@ -1367,15 +1334,55 @@ int ha_calpont_group_by_handler::end_scan() DBUG_RETURN(rc); } +/* +// compression_type +enum mcs_compression_type_t { + NO_COMPRESSION = 0, + SNAPPY = 2 +}; +const char* mcs_compression_type_names[] = { + "NO_COMPRESSION", + "SNAPPY", + NullS +}; -static struct st_mysql_sys_var* calpont_system_variables[] = -{ -// MYSQL_SYSVAR(enum_var), -// MYSQL_SYSVAR(ulong_var), +static TYPELIB mcs_compression_type_names_lib = { + array_elements(mcs_compression_type_names) - 1, + "mcs_compression_type_names", + mcs_compression_type_names, NULL }; +static MYSQL_THDVAR_ENUM( + compression_type, + PLUGIN_VAR_RQCMDARG, + "Controls compression type for create tables. Possible values are: " + "NO_COMPRESSION segment files aren't compressed; " + "SNAPPY segment files are Snappy compressed (default);", + NULL, + NULL, + SNAPPY, + &mcs_compression_type_names_lib); + +// original query +static MYSQL_THDVAR_STR( + original_query, + PLUGIN_VAR_MEMALLOC | + PLUGIN_VAR_RQCMDARG, + "Original query text", + NULL, + NULL, + NULL +); + +static struct st_mysql_sys_var* columnstore_system_variables[] = +{ + MYSQL_SYSVAR(compression_type), + MYSQL_SYSVAR(original_query), + NULL +};*/ + mysql_declare_plugin(columnstore) { MYSQL_STORAGE_ENGINE_PLUGIN, @@ -1388,7 +1395,7 @@ mysql_declare_plugin(columnstore) columnstore_done_func, /* Plugin Deinit */ 0x0100 /* 1.0 */, NULL, /* status variables */ - calpont_system_variables, /* system variables */ + mcs_system_variables, /* system variables */ NULL, /* reserved */ 0 /* config flags */ }, @@ -1403,7 +1410,7 @@ mysql_declare_plugin(columnstore) infinidb_done_func, /* Plugin Deinit */ 0x0100 /* 1.0 */, NULL, /* status variables */ - calpont_system_variables, /* system variables */ + mcs_system_variables, /* system variables */ NULL, /* reserved */ 0 /* config flags */ } @@ -1419,9 +1426,9 @@ maria_declare_plugin(columnstore) columnstore_init_func, columnstore_done_func, 0x0100, /* 1.0 */ - NULL, /* status variables */ - calpont_system_variables, /* system variables */ - "1.0", /* string version */ + NULL, /* status variables */ + mcs_system_variables, /* system variables */ + "1.0", /* string version */ MariaDB_PLUGIN_MATURITY_STABLE /* maturity */ }, { @@ -1434,10 +1441,10 @@ maria_declare_plugin(columnstore) infinidb_init_func, infinidb_done_func, 0x0100, /* 1.0 */ - NULL, /* status variables */ - calpont_system_variables, /* system variables */ - "1.0", /* string version */ - MariaDB_PLUGIN_MATURITY_STABLE /* maturity */ + NULL, /* status variables */ + mcs_system_variables, /* system variables */ + "1.0", /* string version */ + MariaDB_PLUGIN_MATURITY_STABLE /* maturity */ } maria_declare_plugin_end; diff --git a/dbcon/mysql/ha_calpont.h b/dbcon/mysql/ha_calpont.h index e618ed4f0..4ce29b5a6 100644 --- a/dbcon/mysql/ha_calpont.h +++ b/dbcon/mysql/ha_calpont.h @@ -15,35 +15,16 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -/** @file ha_example.h - - @brief - The ha_example engine is a stubbed storage engine for example purposes only; - it does nothing at this point. Its purpose is to provide a source - code illustration of how to begin writing new storage engines; see also - /storage/example/ha_example.cc. - - @note - Please read ha_example.cc before reading this file. - Reminder: The example storage engine implements all methods that are *required* - to be implemented. For a full list of all methods that you can implement, see - handler.h. - - @see - /sql/handler.h and /storage/example/ha_example.cc -*/ - -// $Id: ha_calpont.h 9210 2013-01-21 14:10:42Z rdempsey $ - #ifndef HA_CALPONT_H__ #define HA_CALPONT_H__ #include #include "idb_mysql.h" +#include "mcs_sysvars.h" extern handlerton* calpont_hton; /** @brief - EXAMPLE_SHARE is a structure that will be shared among all open handlers. + This structure will be shared among all open handlers. This example implements the minimum of what you will probably need. */ typedef struct st_calpont_share @@ -62,6 +43,7 @@ class ha_calpont: public handler THR_LOCK_DATA lock; ///< MySQL lock INFINIDB_SHARE* share; ///< Shared lock info ulonglong int_table_flags; + void* fe_conn_info; public: ha_calpont(handlerton* hton, TABLE_SHARE* table_arg); diff --git a/dbcon/mysql/ha_calpont_ddl.cpp b/dbcon/mysql/ha_calpont_ddl.cpp index 487e0d4f8..cc77c0f89 100644 --- a/dbcon/mysql/ha_calpont_ddl.cpp +++ b/dbcon/mysql/ha_calpont_ddl.cpp @@ -49,6 +49,7 @@ using namespace std; #include using namespace boost; +#include "mcs_sysvars.h" #include "idb_mysql.h" #include "ha_calpont_impl_if.h" @@ -2128,7 +2129,7 @@ int ha_calpont_impl_create_(const char* name, TABLE* table_arg, HA_CREATE_INFO* return 1; } - int compressiontype = thd->variables.infinidb_compression_type; + int compressiontype = get_compression_type(thd); if (compressiontype == 1) compressiontype = 2; @@ -2140,7 +2141,7 @@ int ha_calpont_impl_create_(const char* name, TABLE* table_arg, HA_CREATE_INFO* } if ( compressiontype == MAX_INT ) - compressiontype = thd->variables.infinidb_compression_type; + compressiontype = get_compression_type(thd); else if ( compressiontype < 0 ) { string emsg = IDBErrorInfo::instance()->errorMsg(ERR_INVALID_COMPRESSION_TYPE); @@ -2473,12 +2474,12 @@ extern "C" if ( thd->db.length ) db = thd->db.str; - int compressiontype = thd->variables.infinidb_compression_type; + int compressiontype = get_compression_type(thd); if (compressiontype == 1) compressiontype = 2; if ( compressiontype == MAX_INT ) - compressiontype = thd->variables.infinidb_compression_type; + compressiontype = get_compression_type(thd); //hdfs if ((compressiontype == 0) && (useHdfs)) diff --git a/dbcon/mysql/ha_calpont_impl.cpp b/dbcon/mysql/ha_calpont_impl.cpp index 3be44d2b8..4bbdac344 100644 --- a/dbcon/mysql/ha_calpont_impl.cpp +++ b/dbcon/mysql/ha_calpont_impl.cpp @@ -142,6 +142,7 @@ using namespace funcexp; #include "installdir.h" #include "columnstoreversion.h" +#include "mcs_sysvars.h" namespace cal_impl_if { @@ -2767,8 +2768,14 @@ int ha_calpont_impl_discover_existence(const char* schema, const char* name) return 0; } -int ha_calpont_impl_rnd_init(TABLE* table) +int ha_calpont_impl_rnd_init(TABLE* table, mcs_handler_info hndtl_ptr) { + ha_calpont* handler; + if ( hndtl_ptr.hndl_type == LEGACY ) + { + handler = reinterpret_cast(hndtl_ptr.hndl_ptr); + } + #ifdef DEBUG_SETENV string home(getenv("HOME")); @@ -3092,8 +3099,9 @@ int ha_calpont_impl_rnd_init(TABLE* table) return 0; string query; - query.assign(thd->infinidb_vtable.original_query.ptr(), - thd->infinidb_vtable.original_query.length()); + const char *original_query = get_original_query(current_thd); + query.assign(original_query, + strlen(original_query)); csep->data(query); try diff --git a/dbcon/mysql/ha_calpont_impl.h b/dbcon/mysql/ha_calpont_impl.h index 7f7c43aae..db465ea83 100644 --- a/dbcon/mysql/ha_calpont_impl.h +++ b/dbcon/mysql/ha_calpont_impl.h @@ -16,12 +16,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -/* - * $Id: ha_calpont_impl.h 9413 2013-04-22 22:03:42Z zzhu $ - */ - -/** @file */ - #ifndef HA_CALPONT_IMPL_H__ #define HA_CALPONT_IMPL_H__ @@ -33,7 +27,7 @@ extern int ha_calpont_impl_create(const char* name, TABLE* table_arg, HA_CREATE_ extern int ha_calpont_impl_delete_table(const char* name); extern int ha_calpont_impl_open(const char* name, int mode, uint32_t test_if_locked); extern int ha_calpont_impl_close(void); -extern int ha_calpont_impl_rnd_init(TABLE* table); +extern int ha_calpont_impl_rnd_init(TABLE* table, mcs_handler_info hndtl_ptr); extern int ha_calpont_impl_rnd_next(uchar* buf, TABLE* table); extern int ha_calpont_impl_rnd_end(TABLE* table); extern int ha_calpont_impl_write_row(uchar* buf, TABLE* table); diff --git a/dbcon/mysql/ha_calpont_impl_if.h b/dbcon/mysql/ha_calpont_impl_if.h index 72579111b..23d9461c2 100644 --- a/dbcon/mysql/ha_calpont_impl_if.h +++ b/dbcon/mysql/ha_calpont_impl_if.h @@ -321,8 +321,6 @@ struct cal_connection_info std::vector columnTypes; }; -typedef std::tr1::unordered_map CalConnMap; - const std::string infinidb_err_msg = "\nThe query includes syntax that is not supported by MariaDB Columnstore. Use 'show warnings;' to get more information. Review the MariaDB Columnstore Syntax guide for additional information on supported distributed syntax or consider changing the MariaDB Columnstore Operating Mode (infinidb_vtable_mode)."; int cp_get_plan(THD* thd, execplan::SCSEP& csep);