summaryrefslogtreecommitdiff
path: root/libmysqld
diff options
context:
space:
mode:
Diffstat (limited to 'libmysqld')
-rw-r--r--libmysqld/CMakeLists.txt10
-rw-r--r--libmysqld/emb_qcache.cc2
-rw-r--r--libmysqld/lib_sql.cc72
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: