diff options
Diffstat (limited to 'libmysqld')
-rw-r--r-- | libmysqld/CMakeLists.txt | 10 | ||||
-rw-r--r-- | libmysqld/emb_qcache.cc | 2 | ||||
-rw-r--r-- | libmysqld/lib_sql.cc | 72 |
3 files changed, 67 insertions, 17 deletions
diff --git a/libmysqld/CMakeLists.txt b/libmysqld/CMakeLists.txt index de0a356e80e..3bcaab597b7 100644 --- a/libmysqld/CMakeLists.txt +++ b/libmysqld/CMakeLists.txt @@ -65,13 +65,15 @@ SET(SQL_EMBEDDED_SOURCES emb_qcache.cc libmysqld.c lib_sql.cc ../sql/sql_analyse.cc ../sql/sql_base.cc ../sql/sql_cache.cc ../sql/sql_class.cc ../sql/sql_crypt.cc ../sql/sql_cursor.cc ../sql/sql_db.cc ../sql/sql_delete.cc ../sql/sql_derived.cc - ../sql/sql_do.cc ../sql/sql_error.cc ../sql/sql_handler.cc + ../sql/sql_do.cc ../sql/sql_error.cc ../sql/sql_handler.cc + ../sql/sql_get_diagnostics.cc ../sql/sql_help.cc ../sql/sql_insert.cc ../sql/datadict.cc ../sql/sql_admin.cc ../sql/sql_truncate.cc ../sql/sql_reload.cc ../sql/sql_lex.cc ../sql/keycaches.cc ../sql/sql_list.cc ../sql/sql_load.cc ../sql/sql_locale.cc ../sql/sql_binlog.cc ../sql/sql_manager.cc - ../sql/sql_parse.cc ../sql/sql_partition.cc ../sql/sql_plugin.cc + ../sql/sql_parse.cc ../sql/sql_bootstrap.cc + ../sql/sql_partition.cc ../sql/sql_plugin.cc ../sql/debug_sync.cc ../sql/opt_table_elimination.cc ../sql/sql_prepare.cc ../sql/sql_rename.cc ../sql/sql_repl.cc ../sql/sql_select.cc ../sql/sql_servers.cc @@ -101,6 +103,8 @@ SET(SQL_EMBEDDED_SOURCES emb_qcache.cc libmysqld.c lib_sql.cc ../sql/my_apc.cc ../sql/my_apc.h ../sql/rpl_gtid.cc ../sql/sql_explain.cc ../sql/sql_explain.h + ../sql/compat56.cc + ../sql/table_cache.cc ${GEN_SOURCES} ${MYSYS_LIBWRAP_SOURCE} ) @@ -120,7 +124,7 @@ ENDIF() SET(LIBS - dbug strings mysys pcre vio + dbug strings mysys mysys_ssl pcre vio ${ZLIB_LIBRARY} ${SSL_LIBRARIES} ${LIBWRAP} ${LIBCRYPT} ${LIBDL} ${MYSQLD_STATIC_PLUGIN_LIBS} diff --git a/libmysqld/emb_qcache.cc b/libmysqld/emb_qcache.cc index abb0631ebfb..f1e850f4218 100644 --- a/libmysqld/emb_qcache.cc +++ b/libmysqld/emb_qcache.cc @@ -487,7 +487,7 @@ int emb_load_querycache_result(THD *thd, Querycache_stream *src) data->embedded_info->prev_ptr= prev_row; return_ok: net_send_eof(thd, thd->server_status, - thd->warning_info->statement_warn_count()); + thd->get_stmt_da()->current_statement_warn_count()); DBUG_RETURN(0); err: DBUG_RETURN(1); diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc index f87d33ac7c5..1c043c6d03b 100644 --- a/libmysqld/lib_sql.cc +++ b/libmysqld/lib_sql.cc @@ -130,7 +130,7 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command, /* Clear result variables */ thd->clear_error(); - thd->stmt_da->reset_diagnostics_area(); + thd->get_stmt_da()->reset_diagnostics_area(); mysql->affected_rows= ~(my_ulonglong) 0; mysql->field_count= 0; net_clear_error(net); @@ -241,7 +241,7 @@ static my_bool emb_read_prepare_result(MYSQL *mysql, MYSQL_STMT *stmt) stmt->stmt_id= thd->client_stmt_id; stmt->param_count= thd->client_param_count; stmt->field_count= 0; - mysql->warning_count= thd->warning_info->statement_warn_count(); + mysql->warning_count= thd->get_stmt_da()->current_statement_warn_count(); if (thd->first_data) { @@ -332,8 +332,8 @@ static int emb_stmt_execute(MYSQL_STMT *stmt) thd->client_param_count= stmt->param_count; thd->client_params= stmt->params; - res= test(emb_advanced_command(stmt->mysql, COM_STMT_EXECUTE, 0, 0, - header, sizeof(header), 1, stmt) || + res= MY_TEST(emb_advanced_command(stmt->mysql, COM_STMT_EXECUTE, 0, 0, + header, sizeof(header), 1, stmt) || emb_read_query_result(stmt->mysql)); stmt->affected_rows= stmt->mysql->affected_rows; stmt->insert_id= stmt->mysql->insert_id; @@ -430,7 +430,7 @@ static void emb_free_embedded_thd(MYSQL *mysql) static const char * emb_read_statistics(MYSQL *mysql) { THD *thd= (THD*)mysql->thd; - return thd->is_error() ? thd->stmt_da->message() : ""; + return thd->is_error() ? thd->get_stmt_da()->message() : ""; } @@ -544,6 +544,10 @@ int init_embedded_server(int argc, char **argv, char **groups) system_charset_info= &my_charset_utf8_general_ci; sys_var_init(); + int ho_error= handle_early_options(); + if (ho_error != 0) + return 1; + if (init_common_variables()) { mysql_server_end(); @@ -636,7 +640,6 @@ void init_embedded_mysql(MYSQL *mysql, int client_flag) thd->mysql= mysql; mysql->server_version= server_version; mysql->client_flag= client_flag; - //mysql->server_capabilities= client_flag; init_alloc_root(&mysql->field_alloc, 8192, 0, MYF(0)); } @@ -669,7 +672,7 @@ void *create_embedded_thd(int client_flag) if (thd->variables.max_join_size == HA_POS_ERROR) thd->variables.option_bits |= OPTION_BIG_SELECTS; thd->proc_info=0; // Remove 'login' - thd->command=COM_SLEEP; + thd->set_command(COM_SLEEP); thd->set_time(); thd->init_for_queries(); thd->client_capabilities= client_flag; @@ -699,11 +702,37 @@ err: #ifdef NO_EMBEDDED_ACCESS_CHECKS +static void +emb_transfer_connect_attrs(MYSQL *mysql) +{ +#ifdef HAVE_PSI_THREAD_INTERFACE + if (mysql->options.extension && + mysql->options.extension->connection_attributes_length) + { + uchar *buf, *ptr; + THD *thd= (THD*)mysql->thd; + size_t length= mysql->options.extension->connection_attributes_length; + + /* 9 = max length of the serialized length */ + ptr= buf= (uchar *) my_alloca(length + 9); + send_client_connect_attrs(mysql, buf); + net_field_length_ll(&ptr); + PSI_THREAD_CALL(set_thread_connect_attrs)((char *) ptr, length, thd->charset()); + my_afree(buf); + } +#endif +} + + int check_embedded_connection(MYSQL *mysql, const char *db) { int result; LEX_STRING db_str = { (char*)db, db ? strlen(db) : 0 }; THD *thd= (THD*)mysql->thd; + + /* the server does the same as the client */ + mysql->server_capabilities= mysql->client_flag; + thd_init_client_charset(thd, mysql->charset->number); thd->update_charset(); Security_context *sctx= thd->security_ctx; @@ -713,6 +742,7 @@ int check_embedded_connection(MYSQL *mysql, const char *db) sctx->user= my_strdup(mysql->user, MYF(0)); sctx->proxy_user[0]= 0; sctx->master_access= GLOBAL_ACLS; // Full rights + emb_transfer_connect_attrs(mysql); /* Change database if necessary */ if (!(result= (db && db[0] && mysql_change_db(thd, &db_str, FALSE)))) my_ok(thd); @@ -728,11 +758,17 @@ int check_embedded_connection(MYSQL *mysql, const char *db) we emulate a COM_CHANGE_USER user here, it's easier than to emulate the complete 3-way handshake */ - char buf[USERNAME_LENGTH + SCRAMBLE_LENGTH + 1 + 2*NAME_LEN + 2], *end; + char *buf, *end; NET *net= &mysql->net; THD *thd= (THD*)mysql->thd; Security_context *sctx= thd->security_ctx; + size_t connect_attrs_len= + (mysql->options.extension) ? + mysql->options.extension->connection_attributes_length : 0; + buf= (char *)my_alloca(USERNAME_LENGTH + SCRAMBLE_LENGTH + 1 + + 2*NAME_LEN + 2 + + connect_attrs_len + 2); if (mysql->options.client_ip) { sctx->host= my_strdup(mysql->options.client_ip, MYF(0)); @@ -766,21 +802,31 @@ int check_embedded_connection(MYSQL *mysql, const char *db) int2store(end, (ushort) mysql->charset->number); end+= 2; + // There is no pluging compatibility in the embedded server + //end= strmake(end, "mysql_native_password", NAME_LEN) + 1; + + /* the server does the same as the client */ + mysql->server_capabilities= mysql->client_flag; + + end= (char *) send_client_connect_attrs(mysql, (uchar *) end); + /* acl_authenticate() takes the data from thd->net->read_pos */ thd->net.read_pos= (uchar*)buf; if (acl_authenticate(thd, 0, end - buf)) { - x_free(thd->security_ctx->user); + my_free(thd->security_ctx->user); goto err; } + my_afree(buf); return 0; err: - strmake_buf(net->last_error, thd->main_da.message()); + strmake_buf(net->last_error, thd->get_stmt_da()->message()); memcpy(net->sqlstate, - mysql_errno_to_sqlstate(thd->main_da.sql_errno()), + mysql_errno_to_sqlstate(thd->get_stmt_da()->sql_errno()), sizeof(net->sqlstate)-1); + my_afree(buf); return 1; } #endif @@ -889,7 +935,7 @@ write_eof_packet(THD *thd, uint server_status, uint statement_warn_count) is cleared between substatements, and mysqltest gets confused */ thd->cur_data->embedded_info->warning_count= - (thd->spcont ? 0 : min(statement_warn_count, 65535)); + (thd->spcont ? 0 : MY_MIN(statement_warn_count, 65535)); return FALSE; } @@ -1049,7 +1095,7 @@ bool Protocol::send_result_set_metadata(List<Item> *list, uint flags) if (flags & SEND_EOF) write_eof_packet(thd, thd->server_status, - thd->warning_info->statement_warn_count()); + thd->get_stmt_da()->current_statement_warn_count()); DBUG_RETURN(prepare_for_send(list->elements)); err: |