diff --git a/mysql-test/r/query_cache.result b/mysql-test/r/query_cache.result index 18f9db1743d..118c6785136 100644 --- a/mysql-test/r/query_cache.result +++ b/mysql-test/r/query_cache.result @@ -1933,6 +1933,152 @@ select @@query_cache_size, @@global.query_cache_type, @@local.query_cache_type; @@query_cache_size @@global.query_cache_type @@local.query_cache_type 20971520 ON ON # +# MDEV-4981: Account for queries handled by query-cache in +# USER_STATISTICS (and in HOST_STATISTICS) +# +SET GLOBAL userstat=1; +set GLOBAL query_cache_size=1355776; +FLUSH USER_STATISTICS; +FLUSH CLIENT_STATISTICS; +reset query cache; +flush status; +create table t1 (a int); +insert into t1 values (1); +select * from t1; +a +1 +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +1 1 0 +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +2 2 0 +show status like "Qcache_hits"; +Variable_name Value +Qcache_hits 0 +select * from t1; +a +1 +select * from t1; +a +1 +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +5 5 0 +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +6 6 0 +show status like "Qcache_hits"; +Variable_name Value +Qcache_hits 2 +drop table t1; +FLUSH USER_STATISTICS; +FLUSH CLIENT_STATISTICS; +flush status; +create table t1 (a int); +select * from t1; +a +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +1 0 1 +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +2 1 1 +show status like "Qcache_hits"; +Variable_name Value +Qcache_hits 0 +select * from t1; +a +select * from t1; +a +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +5 2 3 +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +6 3 3 +show status like "Qcache_hits"; +Variable_name Value +Qcache_hits 2 +FLUSH USER_STATISTICS; +FLUSH CLIENT_STATISTICS; +flush status; +create procedure p1() +select * from t1; +call p1; +a +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +1 0 1 +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +2 1 1 +show status like "Qcache_hits"; +Variable_name Value +Qcache_hits 0 +call p1; +a +call p1; +a +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +5 2 3 +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +6 3 3 +show status like "Qcache_hits"; +Variable_name Value +Qcache_hits 2 +FLUSH USER_STATISTICS; +FLUSH CLIENT_STATISTICS; +flush status; +SET GLOBAL query_cache_size= 0; +call p1; +a +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +1 0 1 +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +2 1 1 +show status like "Qcache_hits"; +Variable_name Value +Qcache_hits 0 +call p1; +a +call p1; +a +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +5 2 3 +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +SELECT_COMMANDS ROWS_SENT EMPTY_QUERIES +6 3 3 +show status like "Qcache_hits"; +Variable_name Value +Qcache_hits 0 +drop procedure p1; +drop table t1; +set GLOBAL query_cache_size=1355776; +SET GLOBAL userstat=default; +End of 5.5 tests +# # Bug#12977203: SERVER CRASH ON A DERIVED TABLE WITH QUERY CACHE ENABLED # SET @qc= @@query_cache_size; @@ -1944,8 +2090,6 @@ COUNT(*) DROP TABLE t1; SET GLOBAL query_cache_size= @qc; # -End of 5.5 tests -# # MDEV-617 LP:671189 - Query cache is not used for tables or # databases with dots in their names # diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index 3969d9d4a09..2200534b2a1 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -4873,6 +4873,52 @@ execute s; deallocate prepare s; drop view v1; drop tables t1,t2; +# +# MDEV-5034 (duplicate of MDEV-5107): +# Left Join Yields All Nulls Instead of Appropriate Matches +# +# test #1 +CREATE TABLE t1 (state VARCHAR(32), INDEX(state)); +INSERT INTO t1 VALUES ('Indiana'),('Vermont'); +CREATE TABLE t2 (state VARCHAR(32)); +INSERT INTO t2 VALUES ('Hawaii'),('Oregon'),('Vermont'); +CREATE ALGORITHM=MERGE VIEW v1 AS SELECT t1.* FROM t2, t1; +SELECT * FROM t1 AS outer_t1 LEFT JOIN v1 AS joined_t1 +ON (joined_t1.state = outer_t1.state AND joined_t1.state IN ( SELECT 'Vermont' UNION SELECT 'Florida' ) ); +state state +Indiana NULL +Vermont Vermont +Vermont Vermont +Vermont Vermont +SELECT * FROM t1 AS outer_t1 LEFT JOIN (SELECT t1.* FROM t2, t1) AS joined_t1 ON (joined_t1.state = outer_t1.state AND joined_t1.state IN ( SELECT 'Vermont' UNION SELECT 'Florida' ) ); +state state +Indiana NULL +Vermont Vermont +Vermont Vermont +Vermont Vermont +drop view v1; +drop table t1, t2; +# test #1 +CREATE TABLE t1 (a INT, b VARCHAR(1), INDEX(b,a)); +INSERT INTO t1 VALUES (4,'p'),(1,'q'),(9,'w'); +CREATE TABLE t2 (c VARCHAR(1), INDEX(c)); +INSERT INTO t2 VALUES ('q'),('a'); +CREATE ALGORITHM=MERGE VIEW v1 AS SELECT t1a.* FROM t1, t1 AS t1a; +SELECT * FROM t2 LEFT JOIN v1 ON ( c=b AND a IN ( 1,6 ) ); +c a b +a NULL NULL +q 1 q +q 1 q +q 1 q +CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT t1a.* FROM t1, t1 AS t1a; +SELECT * FROM t2 LEFT JOIN v1 ON ( c=b AND a IN ( 1,6 ) ); +c a b +a NULL NULL +q 1 q +q 1 q +q 1 q +drop view v1; +drop table t1,t2; # ----------------------------------------------------------------- # -- End of 5.3 tests. # ----------------------------------------------------------------- @@ -4917,7 +4963,7 @@ create algorithm=merge view v1 as select t1.a as a, (select max(b) from t2 where explain extended select * from v1; id select_type table type possible_keys key key_len ref rows filtered Extra -1 SIMPLE t1 ALL NULL NULL NULL NULL 6 100.00 +1 PRIMARY t1 ALL NULL NULL NULL NULL 6 100.00 3 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 6 100.00 Using where Warnings: Note 1276 Field or reference 'test.t1.a' of SELECT #3 was resolved in SELECT #2 @@ -4933,8 +4979,8 @@ a c explain extended select * from t2, v1 where t2.a=v1.a; id select_type table type possible_keys key key_len ref rows filtered Extra -1 SIMPLE t2 ALL NULL NULL NULL NULL 6 100.00 -1 SIMPLE t1 ALL NULL NULL NULL NULL 6 100.00 Using where; Using join buffer (flat, BNL join) +1 PRIMARY t2 ALL NULL NULL NULL NULL 6 100.00 +1 PRIMARY t1 ALL NULL NULL NULL NULL 6 100.00 Using where; Using join buffer (flat, BNL join) 3 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 6 100.00 Using where Warnings: Note 1276 Field or reference 'test.t1.a' of SELECT #3 was resolved in SELECT #2 @@ -4952,8 +4998,8 @@ a b a c explain extended select * from t1, v1 where t1.a=v1.a; id select_type table type possible_keys key key_len ref rows filtered Extra -1 SIMPLE t1 ALL NULL NULL NULL NULL 6 100.00 -1 SIMPLE t1 ALL NULL NULL NULL NULL 6 100.00 Using where; Using join buffer (flat, BNL join) +1 PRIMARY t1 ALL NULL NULL NULL NULL 6 100.00 +1 PRIMARY t1 ALL NULL NULL NULL NULL 6 100.00 Using where; Using join buffer (flat, BNL join) 3 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 6 100.00 Using where Warnings: Note 1276 Field or reference 'test.t1.a' of SELECT #3 was resolved in SELECT #2 @@ -4971,8 +5017,8 @@ a b a c explain extended select * from t1, v1 where t1.b=v1.c; id select_type table type possible_keys key key_len ref rows filtered Extra -1 SIMPLE t1 ALL NULL NULL NULL NULL 6 100.00 -1 SIMPLE t1 ALL NULL NULL NULL NULL 6 100.00 Using where; Using join buffer (flat, BNL join) +1 PRIMARY t1 ALL NULL NULL NULL NULL 6 100.00 +1 PRIMARY t1 ALL NULL NULL NULL NULL 6 100.00 Using where; Using join buffer (flat, BNL join) 3 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 6 100.00 Using where Warnings: Note 1276 Field or reference 'test.t1.a' of SELECT #3 was resolved in SELECT #2 @@ -4988,9 +5034,9 @@ a b a c explain extended select * from t2, t1, v1 where t1.a=t2.a and t1.a=v1.a; id select_type table type possible_keys key key_len ref rows filtered Extra -1 SIMPLE t2 ALL NULL NULL NULL NULL 6 100.00 -1 SIMPLE t1 ALL NULL NULL NULL NULL 6 100.00 Using where; Using join buffer (flat, BNL join) -1 SIMPLE t1 ALL NULL NULL NULL NULL 6 100.00 Using where; Using join buffer (incremental, BNL join) +1 PRIMARY t2 ALL NULL NULL NULL NULL 6 100.00 +1 PRIMARY t1 ALL NULL NULL NULL NULL 6 100.00 Using where; Using join buffer (flat, BNL join) +1 PRIMARY t1 ALL NULL NULL NULL NULL 6 100.00 Using where; Using join buffer (incremental, BNL join) 3 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 6 100.00 Using where Warnings: Note 1276 Field or reference 'test.t1.a' of SELECT #3 was resolved in SELECT #2 diff --git a/mysql-test/t/query_cache.test b/mysql-test/t/query_cache.test index a8a71dcf8b3..387dcd205bd 100644 --- a/mysql-test/t/query_cache.test +++ b/mysql-test/t/query_cache.test @@ -1617,6 +1617,99 @@ select @@query_cache_size, @@global.query_cache_type, @@local.query_cache_type; set local query_cache_type= on; select @@query_cache_size, @@global.query_cache_type, @@local.query_cache_type; +--echo # +--echo # MDEV-4981: Account for queries handled by query-cache in +--echo # USER_STATISTICS (and in HOST_STATISTICS) +--echo # + +SET GLOBAL userstat=1; +set GLOBAL query_cache_size=1355776; +FLUSH USER_STATISTICS; +FLUSH CLIENT_STATISTICS; +reset query cache; +flush status; + +create table t1 (a int); +insert into t1 values (1); +select * from t1; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +show status like "Qcache_hits"; +select * from t1; +select * from t1; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +show status like "Qcache_hits"; + +drop table t1; +FLUSH USER_STATISTICS; +FLUSH CLIENT_STATISTICS; +flush status; + +create table t1 (a int); +select * from t1; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +show status like "Qcache_hits"; +select * from t1; +select * from t1; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +show status like "Qcache_hits"; + +FLUSH USER_STATISTICS; +FLUSH CLIENT_STATISTICS; +flush status; + +create procedure p1() + select * from t1; +call p1; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +show status like "Qcache_hits"; +call p1; +call p1; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +show status like "Qcache_hits"; + +FLUSH USER_STATISTICS; +FLUSH CLIENT_STATISTICS; +flush status; + +SET GLOBAL query_cache_size= 0; +call p1; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +show status like "Qcache_hits"; +call p1; +call p1; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.CLIENT_STATISTICS +where CLIENT="localhost"; +select SELECT_COMMANDS,ROWS_SENT,EMPTY_QUERIES from INFORMATION_SCHEMA.USER_STATISTICS +where USER="root"; +show status like "Qcache_hits"; +drop procedure p1; +drop table t1; +set GLOBAL query_cache_size=1355776; +SET GLOBAL userstat=default; + +--echo End of 5.5 tests + --echo # --echo # Bug#12977203: SERVER CRASH ON A DERIVED TABLE WITH QUERY CACHE ENABLED --echo # @@ -1626,9 +1719,6 @@ CREATE TABLE t1 (f1 blob); SELECT COUNT(*) FROM (SELECT * FROM t1 ) tt; DROP TABLE t1; SET GLOBAL query_cache_size= @qc; ---echo # - ---echo End of 5.5 tests --echo # --echo # MDEV-617 LP:671189 - Query cache is not used for tables or diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index db05b917c80..307bfa673f3 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -4808,6 +4808,43 @@ deallocate prepare s; drop view v1; drop tables t1,t2; +--echo # +--echo # MDEV-5034 (duplicate of MDEV-5107): +--echo # Left Join Yields All Nulls Instead of Appropriate Matches +--echo # + + --echo # test #1 + +CREATE TABLE t1 (state VARCHAR(32), INDEX(state)); +INSERT INTO t1 VALUES ('Indiana'),('Vermont'); + +CREATE TABLE t2 (state VARCHAR(32)); +INSERT INTO t2 VALUES ('Hawaii'),('Oregon'),('Vermont'); + +CREATE ALGORITHM=MERGE VIEW v1 AS SELECT t1.* FROM t2, t1; +SELECT * FROM t1 AS outer_t1 LEFT JOIN v1 AS joined_t1 +ON (joined_t1.state = outer_t1.state AND joined_t1.state IN ( SELECT 'Vermont' UNION SELECT 'Florida' ) ); + +SELECT * FROM t1 AS outer_t1 LEFT JOIN (SELECT t1.* FROM t2, t1) AS joined_t1 ON (joined_t1.state = outer_t1.state AND joined_t1.state IN ( SELECT 'Vermont' UNION SELECT 'Florida' ) ); + +drop view v1; +drop table t1, t2; + +--echo # test #1 + +CREATE TABLE t1 (a INT, b VARCHAR(1), INDEX(b,a)); +INSERT INTO t1 VALUES (4,'p'),(1,'q'),(9,'w'); + +CREATE TABLE t2 (c VARCHAR(1), INDEX(c)); +INSERT INTO t2 VALUES ('q'),('a'); +CREATE ALGORITHM=MERGE VIEW v1 AS SELECT t1a.* FROM t1, t1 AS t1a; +SELECT * FROM t2 LEFT JOIN v1 ON ( c=b AND a IN ( 1,6 ) ); +CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT t1a.* FROM t1, t1 AS t1a; +SELECT * FROM t2 LEFT JOIN v1 ON ( c=b AND a IN ( 1,6 ) ); + +drop view v1; +drop table t1,t2; + --echo # ----------------------------------------------------------------- --echo # -- End of 5.3 tests. --echo # ----------------------------------------------------------------- diff --git a/mysql-test/valgrind.supp b/mysql-test/valgrind.supp index 39748edd476..b09ab0904e7 100644 --- a/mysql-test/valgrind.supp +++ b/mysql-test/valgrind.supp @@ -1096,6 +1096,18 @@ fun:_Z8filesortP3THDP5TABLEP13st_sort_fieldjP10SQL_SELECTybPy } +{ + OpenSSL still reachable. + Memcheck:Leak + fun:*alloc + fun:CRYPTO_malloc + fun:sk_new + obj:*libssl* + fun:SSL_COMP_get_compression_methods + fun:SSL_library_init +} + + { Problem with udf and libresolve Memcheck:Cond diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 1b8727563db..b12f60a031b 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -2825,6 +2825,9 @@ bool one_thread_per_connection_end(THD *thd, bool put_in_cache) mysql_mutex_unlock(&LOCK_thread_count); } DBUG_LEAVE; // Must match DBUG_ENTER() +#ifndef EMBEDDED_LIBRARY + ERR_remove_state(0); +#endif my_thread_end(); pthread_exit(0); @@ -4463,6 +4466,7 @@ static void init_ssl() opt_ssl_cipher, &error, opt_ssl_crl, opt_ssl_crlpath); DBUG_PRINT("info",("ssl_acceptor_fd: 0x%lx", (long) ssl_acceptor_fd)); + ERR_remove_state(0); if (!ssl_acceptor_fd) { sql_print_warning("Failed to setup SSL"); diff --git a/sql/slave.cc b/sql/slave.cc index 350728f32e7..52a8250e23f 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -3987,6 +3987,7 @@ err_during_init: DBUG_LEAVE; // Must match DBUG_ENTER() my_thread_end(); + ERR_remove_state(0); pthread_exit(0); return 0; // Avoid compiler warnings } @@ -4475,6 +4476,7 @@ err_during_init: DBUG_LEAVE; // Must match DBUG_ENTER() my_thread_end(); + ERR_remove_state(0); pthread_exit(0); return 0; // Avoid compiler warnings } diff --git a/sql/sp_head.cc b/sql/sp_head.cc index a43dfe40698..9e7d908f8a3 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -3095,7 +3095,15 @@ sp_instr_stmt::execute(THD *thd, uint *nextp) log_slow_statement(thd); } else + { + /* change statistics */ + enum_sql_command save_sql_command= thd->lex->sql_command; + thd->lex->sql_command= SQLCOM_SELECT; + status_var_increment(thd->status_var.com_stat[SQLCOM_SELECT]); + thd->update_stats(); + thd->lex->sql_command= save_sql_command; *nextp= m_ip+1; + } thd->set_query(query_backup); thd->query_name_consts= 0; diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc index 35285501fba..97034878eef 100644 --- a/sql/sql_cache.cc +++ b/sql/sql_cache.cc @@ -2132,9 +2132,13 @@ def_week_frmt: %lu, in_trans: %d, autocommit: %d", } #endif /*!EMBEDDED_LIBRARY*/ - thd->limit_found_rows = query->found_rows(); + thd->set_sent_row_count(thd->limit_found_rows = query->found_rows()); thd->status_var.last_query_cost= 0.0; thd->query_plan_flags= (thd->query_plan_flags & ~QPLAN_QC_NO) | QPLAN_QC; + if (!thd->get_sent_row_count()) + status_var_increment(thd->status_var.empty_queries); + else + status_var_add(thd->status_var.rows_sent, thd->get_sent_row_count()); /* End the statement transaction potentially started by an diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 8f4b7f98a81..0353ec7fde9 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -5176,7 +5176,8 @@ static bool execute_sqlcom_select(THD *thd, TABLE_LIST *all_tables) /* Count number of empty select queries */ if (!thd->get_sent_row_count()) status_var_increment(thd->status_var.empty_queries); - status_var_add(thd->status_var.rows_sent, thd->get_sent_row_count()); + else + status_var_add(thd->status_var.rows_sent, thd->get_sent_row_count()); return res; } @@ -6340,6 +6341,8 @@ void mysql_parse(THD *thd, char *rawbuf, uint length, thd->m_statement_psi= MYSQL_REFINE_STATEMENT(thd->m_statement_psi, sql_statement_info[SQLCOM_SELECT].m_key); + status_var_increment(thd->status_var.com_stat[SQLCOM_SELECT]); + thd->update_stats(); } DBUG_VOID_RETURN; } diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 2824f6bfd27..3111d82ef15 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -3949,6 +3949,12 @@ bool Prepared_statement::execute(String *expanded_query, bool open_cursor) thd->m_statement_psi= parent_locker; MYSQL_QUERY_EXEC_DONE(error); } + else + { + thd->lex->sql_command= SQLCOM_SELECT; + status_var_increment(thd->status_var.com_stat[SQLCOM_SELECT]); + thd->update_stats(); + } } /* diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 634902fc412..2d6b5aa18fd 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -17150,7 +17150,15 @@ sub_select(JOIN *join,JOIN_TAB *join_tab,bool end_of_records) { DBUG_ENTER("sub_select"); - join_tab->table->null_row=0; + if (join_tab->last_inner) + { + JOIN_TAB *last_inner_tab= join_tab->last_inner; + for (JOIN_TAB *jt= join_tab; jt <= last_inner_tab; jt++) + jt->table->null_row= 0; + } + else + join_tab->table->null_row=0; + if (end_of_records) { enum_nested_loop_state nls= diff --git a/vio/vio.c b/vio/vio.c index 56dff377105..ea95758f212 100644 --- a/vio/vio.c +++ b/vio/vio.c @@ -384,5 +384,11 @@ void vio_end(void) { #ifdef HAVE_YASSL yaSSL_CleanUp(); +#elif defined(HAVE_OPENSSL) + // This one is needed on the client side + ERR_remove_state(0); + ERR_free_strings(); + EVP_cleanup(); + CRYPTO_cleanup_all_ex_data(); #endif }