1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

Fix bug in SELECT SQL_CALC_FOUND_ROWS

Docs/manual.texi:
  Update of new GRANT options
libmysql/manager.c:
  Use new my_gethostbyname_r() functions
mysql-test/r/select_found.result:
  new test case
mysql-test/t/select_found.test:
  new test case
sql/mysqld.cc:
  Change names of some status variables
This commit is contained in:
unknown
2002-05-16 16:06:57 +03:00
parent dc2b6e456f
commit 9ef4edccc2
6 changed files with 254 additions and 124 deletions

View File

@ -3433,6 +3433,11 @@ The following problems are known and will be fixed in due time:
When using @code{SET CHARACTER SET}, one can't use translated When using @code{SET CHARACTER SET}, one can't use translated
characters in database, table, and column names. characters in database, table, and column names.
@item
If you have a @code{DECIMAL} column with a number stored in different
formats (+01.00, 1.00, 01.00), @code{GROUP BY} may regard each value
as a different value.
@item @item
@code{DELETE FROM merge_table} used without a @code{WHERE} @code{DELETE FROM merge_table} used without a @code{WHERE}
will only clear the mapping for the table, not delete everything in the will only clear the mapping for the table, not delete everything in the
@ -16389,6 +16394,7 @@ to restart @code{mysqld} with @code{--skip-grant-tables} to run
* Privilege changes:: When Privilege Changes Take Effect * Privilege changes:: When Privilege Changes Take Effect
* Default privileges:: Setting Up the Initial MySQL Privileges * Default privileges:: Setting Up the Initial MySQL Privileges
* Adding users:: Adding New Users to MySQL * Adding users:: Adding New Users to MySQL
* User resources::
* Passwords:: Setting Up Passwords * Passwords:: Setting Up Passwords
* Password security:: Keeping Your Password Secure * Password security:: Keeping Your Password Secure
* Secure connections:: Using Secure Connections * Secure connections:: Using Secure Connections
@ -16417,7 +16423,8 @@ GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...]
[CIPHER cipher [AND]] [CIPHER cipher [AND]]
[ISSUER issuer [AND]] [ISSUER issuer [AND]]
[SUBJECT subject]] [SUBJECT subject]]
[WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR=#]] [WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR=# | MAX_UPDATES_PER_HOUR=#|
MAX_CONNECTIONS_PER_HOUR=#]]
REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...] REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...]
ON @{tbl_name | * | *.* | db_name.*@} ON @{tbl_name | * | *.* | db_name.*@}
@ -16580,11 +16587,11 @@ to other users any privileges the user has at the specified privilege level.
You should be careful to whom you give the @strong{grant} privilege, as two You should be careful to whom you give the @strong{grant} privilege, as two
users with different privileges may be able to join privileges! users with different privileges may be able to join privileges!
@code{MAX_QUERIES_PER_HOUR=#} limits the number of queries the user can @code{MAX_QUERIES_PER_HOUR=#}, @code{MAX_UPDATES_PER_HOUR=#} and
do during one hour. If @code{#} is 0, then this means that there is no @code{MAX_CONNECTIONS_PER_HOUR=#} limits the limits the number of
limit of the number of queries. This works by MySQL resetting a user queries/updates and logins the user can do during one hour.
specific query counter to 0, after it has gone more than one hour If @code{#} is 0 (default), then this means that there is no limitations
since the counter started incrementing. for the user. @xref{User resources}.
You cannot grant another user a privilege you don't have yourself; You cannot grant another user a privilege you don't have yourself;
the @strong{grant} privilege allows you to give away only those privileges the @strong{grant} privilege allows you to give away only those privileges
@ -16875,7 +16882,7 @@ you should copy them back from your MySQL distribution before
running @code{mysql_install_db}. running @code{mysql_install_db}.
@node Adding users, Passwords, Default privileges, User Account Management @node Adding users, User resources, Default privileges, User Account Management
@subsection Adding New Users to MySQL @subsection Adding New Users to MySQL
@findex GRANT statement @findex GRANT statement
@ -17068,7 +17075,72 @@ You can find these utilities in the Contrib directory of the
MySQL web site (@uref{http://www.mysql.com/Downloads/Contrib/}). MySQL web site (@uref{http://www.mysql.com/Downloads/Contrib/}).
@node Passwords, Password security, Adding users, User Account Management @node User resources, Passwords, Adding users, User Account Management
@subsection Limiting user resources
Starting from MySQL 4.0.2 one can limit certain resources per user.
Before the only available method of limiting user usage of MySQL server
resources has been setting @code{max_user_connections} startup variable
to some non-zero value at MySQL startup. But this method is strictly a
global one and does not allow management of individual users, which
could be of paricular interest to Interent Service Providers.
Therefore, management of three resources is introduced on the
individual user level :
@itemize @bullet
@item
Number of all queries per hour
@item
Number of all updates per hour. As updates is considered any command that
changes any table or database.
@item
Number of connections made per hour
@end itemize
A user in the above context is single entry in user table, which is
uniquely identified by user and host columns.
All users are by default not limited in using the above resources,
unless the limits are GRANTed to them. These limits can be granted
ONLY by global GRANT (*.*) and with a following syntax :
@example
GRANT ... WITH MAX_QUERIES_PER_HOUR = N1 MAX_UPDATES_PER_HOUR = N2
MAX_CONNECTIONS_PER_HOUR = N3;
@end example
One can specify any combination of the above resources.
N1, N2 and N3 are integers and stands for count / hour.
If user reaches any of the above limits withing one hour, his connection
will be broken or refused and the appropriate error message shall be
issued.
Current values of particular user resources can be flushed (set to
zero) by issuing a grant statement with any of the above limiting
clauses, including a GRANT statement with current value(s) of tha
resource(s).
Also, current values for all users will be flushed if privileges are
reloaded or if the folloing new flush command is issuedd :
@example
FLUSH USER_RESOURCES
@end example
Also, current values for all users will be flushed with mysqladmin
reload command.
This new feature is enabled as soon as single user is @code{GRANT}ed with
some of the limiting @code{GRANT} clauses.
As a prerequisite for enabling this features, user table in mysql
database must have the additional columns, just as defined in table
creation scripts @code{mysql_install_db} in the @code{scripts} directory.
@node Passwords, Password security, User resources, User Account Management
@subsection Setting Up Passwords @subsection Setting Up Passwords
@findex PASSWORD() @findex PASSWORD()
@ -19377,6 +19449,7 @@ The status variables listed above have the following meaning:
@item @code{Delayed_writes} @tab Number of rows written with @code{INSERT DELAYED}. @item @code{Delayed_writes} @tab Number of rows written with @code{INSERT DELAYED}.
@item @code{Delayed_errors} @tab Number of rows written with @code{INSERT DELAYED} for which some error occurred (probably @code{duplicate key}). @item @code{Delayed_errors} @tab Number of rows written with @code{INSERT DELAYED} for which some error occurred (probably @code{duplicate key}).
@item @code{Flush_commands} @tab Number of executed @code{FLUSH} commands. @item @code{Flush_commands} @tab Number of executed @code{FLUSH} commands.
@item @code{Handler_commit} @tab Number of internal @code{COMMIT} commands.
@item @code{Handler_delete} @tab Number of times a row was deleted from a table. @item @code{Handler_delete} @tab Number of times a row was deleted from a table.
@item @code{Handler_read_first} @tab Number of times the first entry was read from an index. @item @code{Handler_read_first} @tab Number of times the first entry was read from an index.
If this is high, it suggests that the server is doing a lot of full index scans, for example, If this is high, it suggests that the server is doing a lot of full index scans, for example,
@ -19386,12 +19459,14 @@ is high, it is a good indication that your queries and tables are properly index
@item @code{Handler_read_next} @tab Number of requests to read next row in key order. This @item @code{Handler_read_next} @tab Number of requests to read next row in key order. This
will be incremented if you are querying an index column with a range constraint. This also will be incremented if you are querying an index column with a range constraint. This also
will be incremented if you are doing an index scan. will be incremented if you are doing an index scan.
@item @code{Handler_read_prev} @tab Number of requests to read previous row in key order. This is mainly used to optimize @code{ORDER BY ... DESC}.
@item @code{Handler_read_rnd} @tab Number of requests to read a row based on a fixed position. @item @code{Handler_read_rnd} @tab Number of requests to read a row based on a fixed position.
This will be high if you are doing a lot of queries that require sorting of the result. This will be high if you are doing a lot of queries that require sorting of the result.
@item @code{Handler_read_rnd_next} @tab Number of requests to read the next row in the datafile. @item @code{Handler_read_rnd_next} @tab Number of requests to read the next row in the datafile.
This will be high if you are doing a lot of table scans. Generally this suggests that your tables This will be high if you are doing a lot of table scans. Generally this suggests that your tables
are not properly indexed or that your queries are not written to take advantage of the indexes you are not properly indexed or that your queries are not written to take advantage of the indexes you
have. have.
@item @code{Handler_rollback} @tab Number of internal @code{ROLLBACK} commands.
@item @code{Handler_update} @tab Number of requests to update a row in a table. @item @code{Handler_update} @tab Number of requests to update a row in a table.
@item @code{Handler_write} @tab Number of requests to insert a row in a table. @item @code{Handler_write} @tab Number of requests to insert a row in a table.
@item @code{Key_blocks_used} @tab The number of used blocks in the key cache. @item @code{Key_blocks_used} @tab The number of used blocks in the key cache.
@ -19406,6 +19481,7 @@ have.
@item @code{Open_files} @tab Number of files that are open. @item @code{Open_files} @tab Number of files that are open.
@item @code{Open_streams} @tab Number of streams that are open (used mainly for logging). @item @code{Open_streams} @tab Number of streams that are open (used mainly for logging).
@item @code{Opened_tables} @tab Number of tables that have been opened. @item @code{Opened_tables} @tab Number of tables that have been opened.
@item @code{Rpl_status} @tab Status of failsafe replication. (Not yet in use).
@item @code{Select_full_join} @tab Number of joins without keys (Should be 0). @item @code{Select_full_join} @tab Number of joins without keys (Should be 0).
@item @code{Select_full_range_join} @tab Number of joins where we used a range search on reference table. @item @code{Select_full_range_join} @tab Number of joins where we used a range search on reference table.
@item @code{Select_range} @tab Number of joins where we used ranges on the first table. (It's normally not critical even if this is big.) @item @code{Select_range} @tab Number of joins where we used ranges on the first table. (It's normally not critical even if this is big.)
@ -19414,12 +19490,14 @@ have.
@item @code{Questions} @tab Number of queries sent to the server. @item @code{Questions} @tab Number of queries sent to the server.
@item @code{Slave_open_temp_tables} @tab Number of temporary tables currently @item @code{Slave_open_temp_tables} @tab Number of temporary tables currently
open by the slave thread open by the slave thread
@item @code{Slave_running} @tab Is @code{ON} if this is a slave that is connected to a master.
@item @code{Slow_launch_threads} @tab Number of threads that have taken more than @code{slow_launch_time} to connect. @item @code{Slow_launch_threads} @tab Number of threads that have taken more than @code{slow_launch_time} to connect.
@item @code{Slow_queries} @tab Number of queries that have taken more than @code{long_query_time}. @xref{Slow query log}. @item @code{Slow_queries} @tab Number of queries that have taken more than @code{long_query_time}. @xref{Slow query log}.
@item @code{Sort_merge_passes} @tab Number of merges the sort has to do. If this value is large you should consider increasing @code{sort_buffer}. @item @code{Sort_merge_passes} @tab Number of merges the sort has to do. If this value is large you should consider increasing @code{sort_buffer}.
@item @code{Sort_range} @tab Number of sorts that where done with ranges. @item @code{Sort_range} @tab Number of sorts that where done with ranges.
@item @code{Sort_rows} @tab Number of sorted rows. @item @code{Sort_rows} @tab Number of sorted rows.
@item @code{Sort_scan} @tab Number of sorts that where done by scanning the table. @item @code{Sort_scan} @tab Number of sorts that where done by scanning the table.
@item @code{ssl_xxx} @tab Variables used by SSL; Not yet implemented.
@item @code{Table_locks_immediate} @tab Number of times a table lock was @item @code{Table_locks_immediate} @tab Number of times a table lock was
acquired immediately. Available after 3.23.33. acquired immediately. Available after 3.23.33.
@item @code{Table_locks_waited} @tab Number of times a table lock could not @item @code{Table_locks_waited} @tab Number of times a table lock could not
@ -44293,7 +44371,7 @@ have both a normal and a thread-safe client library.
To get a threaded client where you can interrupt the client from other To get a threaded client where you can interrupt the client from other
threads and set timeouts when talking with the MySQL server, you should threads and set timeouts when talking with the MySQL server, you should
use the @code{-lmysys}, @code{-lstring}, and @code{-ldbug} libraries and use the @code{-lmysys}, @code{-lmystrings}, and @code{-ldbug} libraries and
the @code{net_serv.o} code that the server uses. the @code{net_serv.o} code that the server uses.
If you don't need interrupts or timeouts, you can just compile a If you don't need interrupts or timeouts, you can just compile a
@ -49215,72 +49293,14 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}.
@itemize @bullet @itemize @bullet
@item @item
Fixed bug in DROP DATABASE with symlink Fixed bug in @code{DROP DATABASE} with symlink
@item @item
Fixed bug in EXPLAIN with LIMIT offset != 0 Fixed bug in @code{EXPLAIN} with @code{LIMIT offset != 0}
@item @item
Fixed bug in @code{SELECT SQL_CALC_FOUND_ROWS DISTINCT ... LIMIT #}
New feature : @item
Added limiting of user resources like queries per hour, updates per hour
Management of user resources and connections made per hour.
So far, the only available method of limiting user usage of MySQL
server resources has been setting max_user_connections startup
variable to some non-zero value at MySQL startup. But this method is
strictly a global one and does not allow management of individual
users, which could be of paricular interest to Interent Service
Providers.
Therefore, management of three resources is introduced on the
individual user level :
* number of all queries per hour
* number of all updates per hour
* number of connections made per hour
Small clarification : By the updates in the above sense is considered
any command that changes any table or database. Queries in the above
context comprehend all commands that could be run by user. User in the
above context comprehends a single entry in user table, which is
uniquely identified by user and host columns.
All users are by default not limited in using the above resources,
unless the limits are GRANTed to them. These limits can be granted
ONLY by global GRANT (*.*) and with a following syntax :
GRANT ... WITH MAX_QUERIES_PER_HOUR = N1 MAX_UPDATES_PER_HOUR = N2
MAX_CONNECTIONS_PER_HOUR = N3;
It is not required that all three resources are specified. One or two
can be specified also. N1,N2 and N3 are intergers and should limit
number of times user can execute any command, update command or can
login that many times per hour.
If user reaches any of the above limits withing one hour, his
connection will be broken or refused and the appropriate error message
shall be issued.
Current values of particular user resources can be flushed (set to
zero) by issuing a grant statement with any of the above limiting
clauses, including a GRANT statement with current value(s) of tha
resource(s).
Also, current values for all users will be flushed if privileges are
reloaded or if a new flush command is issued :
flush user_resources.
Also, current values for all users will be flushed with mysqladmin
reload command.
This new feature is enabled as soon as single user is GRANTed with
some of the limiting GRANT clauses.
As a prerequisite for enabling this features, user table in mysql
database must have the additional columns, just as defined in table
creation scripts mysql_install_db and mysql_install_db.sh in scripts/
directory.
@item @item
New configure option --without-query-cache. New configure option --without-query-cache.
@item @item
@ -55339,7 +55359,7 @@ New math functions:
The @code{configure} source now compiles a thread-free client library The @code{configure} source now compiles a thread-free client library
@code{-lmysqlclient}. This is the only library that needs to be linked @code{-lmysqlclient}. This is the only library that needs to be linked
with client applications. When using the binary releases, you must with client applications. When using the binary releases, you must
link with @code{-lmysql -lmysys -ldbug -lstrings} as before. link with @code{-lmysql -lmysys -ldbug -lmystrings} as before.
@item @item
New @code{readline} library from @code{bash-2.0}. New @code{readline} library from @code{bash-2.0}.
@item @item

View File

@ -122,7 +122,6 @@ MYSQL_MANAGER* STDCALL mysql_manager_connect(MYSQL_MANAGER* con,
memcpy_fixed(&sock_addr.sin_addr,&ip_addr,sizeof(ip_addr)); memcpy_fixed(&sock_addr.sin_addr,&ip_addr,sizeof(ip_addr));
} }
else else
#if defined(HAVE_GETHOSTBYNAME_R) && defined(_REENTRANT) && defined(THREAD)
{ {
int tmp_errno; int tmp_errno;
struct hostent tmp_hostent,*hp; struct hostent tmp_hostent,*hp;
@ -133,22 +132,12 @@ MYSQL_MANAGER* STDCALL mysql_manager_connect(MYSQL_MANAGER* con,
{ {
con->last_errno=tmp_errno; con->last_errno=tmp_errno;
sprintf(con->last_error,"Could not resolve host '%s'",host); sprintf(con->last_error,"Could not resolve host '%s'",host);
my_gethostbyname_r_free();
goto err; goto err;
} }
memcpy(&sock_addr.sin_addr,hp->h_addr, (size_t) hp->h_length); memcpy(&sock_addr.sin_addr,hp->h_addr, (size_t) hp->h_length);
my_gethostbyname_r_free();
} }
#else
{
struct hostent *hp;
if (!(hp=gethostbyname(host)))
{
con->last_errno=socket_errno;
sprintf(con->last_error, "Could not resolve host '%s'", host);
goto err;
}
memcpy(&sock_addr.sin_addr,hp->h_addr, (size_t) hp->h_length);
}
#endif
sock_addr.sin_port = (ushort) htons((ushort) port); sock_addr.sin_port = (ushort) htons((ushort) port);
if (my_connect(sock,(struct sockaddr *) &sock_addr, sizeof(sock_addr), if (my_connect(sock,(struct sockaddr *) &sock_addr, sizeof(sock_addr),
0) <0) 0) <0)

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -3734,12 +3734,12 @@ struct show_var_st status_vars[]= {
{"Com_show_grants", (char*) (com_stat+(uint) SQLCOM_SHOW_GRANTS),SHOW_LONG}, {"Com_show_grants", (char*) (com_stat+(uint) SQLCOM_SHOW_GRANTS),SHOW_LONG},
{"Com_show_keys", (char*) (com_stat+(uint) SQLCOM_SHOW_KEYS),SHOW_LONG}, {"Com_show_keys", (char*) (com_stat+(uint) SQLCOM_SHOW_KEYS),SHOW_LONG},
{"Com_show_logs", (char*) (com_stat+(uint) SQLCOM_SHOW_LOGS),SHOW_LONG}, {"Com_show_logs", (char*) (com_stat+(uint) SQLCOM_SHOW_LOGS),SHOW_LONG},
{"Com_show_master_stat", (char*) (com_stat+(uint) SQLCOM_SHOW_MASTER_STAT),SHOW_LONG}, {"Com_show_master_status", (char*) (com_stat+(uint) SQLCOM_SHOW_MASTER_STAT),SHOW_LONG},
{"Com_show_new_master", (char*) (com_stat+(uint) SQLCOM_SHOW_NEW_MASTER),SHOW_LONG}, {"Com_show_new_master", (char*) (com_stat+(uint) SQLCOM_SHOW_NEW_MASTER),SHOW_LONG},
{"Com_show_open_tables", (char*) (com_stat+(uint) SQLCOM_SHOW_OPEN_TABLES),SHOW_LONG}, {"Com_show_open_tables", (char*) (com_stat+(uint) SQLCOM_SHOW_OPEN_TABLES),SHOW_LONG},
{"Com_show_processlist", (char*) (com_stat+(uint) SQLCOM_SHOW_PROCESSLIST),SHOW_LONG}, {"Com_show_processlist", (char*) (com_stat+(uint) SQLCOM_SHOW_PROCESSLIST),SHOW_LONG},
{"Com_show_slave_hosts", (char*) (com_stat+(uint) SQLCOM_SHOW_SLAVE_HOSTS),SHOW_LONG}, {"Com_show_slave_hosts", (char*) (com_stat+(uint) SQLCOM_SHOW_SLAVE_HOSTS),SHOW_LONG},
{"Com_show_slave_stat", (char*) (com_stat+(uint) SQLCOM_SHOW_SLAVE_STAT),SHOW_LONG}, {"Com_show_slave_status", (char*) (com_stat+(uint) SQLCOM_SHOW_SLAVE_STAT),SHOW_LONG},
{"Com_show_status", (char*) (com_stat+(uint) SQLCOM_SHOW_STATUS),SHOW_LONG}, {"Com_show_status", (char*) (com_stat+(uint) SQLCOM_SHOW_STATUS),SHOW_LONG},
{"Com_show_tables", (char*) (com_stat+(uint) SQLCOM_SHOW_TABLES),SHOW_LONG}, {"Com_show_tables", (char*) (com_stat+(uint) SQLCOM_SHOW_TABLES),SHOW_LONG},
{"Com_show_variables", (char*) (com_stat+(uint) SQLCOM_SHOW_VARIABLES),SHOW_LONG}, {"Com_show_variables", (char*) (com_stat+(uint) SQLCOM_SHOW_VARIABLES),SHOW_LONG},
@ -3807,29 +3807,29 @@ struct show_var_st status_vars[]= {
{"Sort_rows", (char*) &filesort_rows, SHOW_LONG}, {"Sort_rows", (char*) &filesort_rows, SHOW_LONG},
{"Sort_scan", (char*) &filesort_scan_count, SHOW_LONG}, {"Sort_scan", (char*) &filesort_scan_count, SHOW_LONG},
#ifdef HAVE_OPENSSL #ifdef HAVE_OPENSSL
{"ssl_accepts", (char*) 0, SHOW_SSL_CTX_SESS_ACCEPT}, {"Ssl_accepts", (char*) 0, SHOW_SSL_CTX_SESS_ACCEPT},
{"ssl_finished_accepts", (char*) 0, SHOW_SSL_CTX_SESS_ACCEPT_GOOD}, {"Ssl_finished_accepts", (char*) 0, SHOW_SSL_CTX_SESS_ACCEPT_GOOD},
{"ssl_finished_connects", (char*) 0, SHOW_SSL_CTX_SESS_CONNECT_GOOD}, {"Ssl_finished_connects", (char*) 0, SHOW_SSL_CTX_SESS_CONNECT_GOOD},
{"ssl_accept_renegotiates", (char*) 0, SHOW_SSL_CTX_SESS_ACCEPT_RENEGOTIATE}, {"Ssl_accept_renegotiates", (char*) 0, SHOW_SSL_CTX_SESS_ACCEPT_RENEGOTIATE},
{"ssl_connect_renegotiates", (char*) 0, SHOW_SSL_CTX_SESS_CONNECT_RENEGOTIATE}, {"Ssl_connect_renegotiates", (char*) 0, SHOW_SSL_CTX_SESS_CONNECT_RENEGOTIATE},
{"ssl_callback_cache_hits", (char*) 0, SHOW_SSL_CTX_SESS_CB_HITS}, {"Ssl_callback_cache_hits", (char*) 0, SHOW_SSL_CTX_SESS_CB_HITS},
{"ssl_session_cache_hits", (char*) 0, SHOW_SSL_CTX_SESS_HITS}, {"Ssl_session_cache_hits", (char*) 0, SHOW_SSL_CTX_SESS_HITS},
{"ssl_session_cache_misses", (char*) 0, SHOW_SSL_CTX_SESS_MISSES}, {"Ssl_session_cache_misses", (char*) 0, SHOW_SSL_CTX_SESS_MISSES},
{"ssl_session_cache_timeouts", (char*) 0, SHOW_SSL_CTX_SESS_TIMEOUTS}, {"Ssl_session_cache_timeouts", (char*) 0, SHOW_SSL_CTX_SESS_TIMEOUTS},
{"ssl_used_session_cache_entries",(char*) 0, SHOW_SSL_CTX_SESS_NUMBER}, {"Ssl_used_session_cache_entries",(char*) 0, SHOW_SSL_CTX_SESS_NUMBER},
{"ssl_client_connects", (char*) 0, SHOW_SSL_CTX_SESS_CONNECT}, {"Ssl_client_connects", (char*) 0, SHOW_SSL_CTX_SESS_CONNECT},
{"ssl_session_cache_overflows", (char*) 0, SHOW_SSL_CTX_SESS_CACHE_FULL}, {"Ssl_session_cache_overflows", (char*) 0, SHOW_SSL_CTX_SESS_CACHE_FULL},
{"ssl_session_cache_size", (char*) 0, SHOW_SSL_CTX_SESS_GET_CACHE_SIZE}, {"Ssl_session_cache_size", (char*) 0, SHOW_SSL_CTX_SESS_GET_CACHE_SIZE},
{"ssl_session_cache_mode", (char*) 0, SHOW_SSL_CTX_GET_SESSION_CACHE_MODE}, {"Ssl_session_cache_mode", (char*) 0, SHOW_SSL_CTX_GET_SESSION_CACHE_MODE},
{"ssl_sessions_reused", (char*) 0, SHOW_SSL_SESSION_REUSED}, {"Ssl_sessions_reused", (char*) 0, SHOW_SSL_SESSION_REUSED},
{"ssl_ctx_verify_mode", (char*) 0, SHOW_SSL_CTX_GET_VERIFY_MODE}, {"Ssl_ctx_verify_mode", (char*) 0, SHOW_SSL_CTX_GET_VERIFY_MODE},
{"ssl_ctx_verify_depth", (char*) 0, SHOW_SSL_CTX_GET_VERIFY_DEPTH}, {"Ssl_ctx_verify_depth", (char*) 0, SHOW_SSL_CTX_GET_VERIFY_DEPTH},
{"ssl_verify_mode", (char*) 0, SHOW_SSL_GET_VERIFY_MODE}, {"Ssl_verify_mode", (char*) 0, SHOW_SSL_GET_VERIFY_MODE},
{"ssl_verify_depth", (char*) 0, SHOW_SSL_GET_VERIFY_DEPTH}, {"Ssl_verify_depth", (char*) 0, SHOW_SSL_GET_VERIFY_DEPTH},
{"ssl_version", (char*) 0, SHOW_SSL_GET_VERSION}, {"Ssl_version", (char*) 0, SHOW_SSL_GET_VERSION},
{"ssl_cipher", (char*) 0, SHOW_SSL_GET_CIPHER}, {"Ssl_cipher", (char*) 0, SHOW_SSL_GET_CIPHER},
{"ssl_cipher_list", (char*) 0, SHOW_SSL_GET_CIPHER_LIST}, {"Ssl_cipher_list", (char*) 0, SHOW_SSL_GET_CIPHER_LIST},
{"ssl_default_timeout", (char*) 0, SHOW_SSL_GET_DEFAULT_TIMEOUT}, {"Ssl_default_timeout", (char*) 0, SHOW_SSL_GET_DEFAULT_TIMEOUT},
#endif /* HAVE_OPENSSL */ #endif /* HAVE_OPENSSL */
{"Table_locks_immediate", (char*) &locks_immediate, SHOW_LONG}, {"Table_locks_immediate", (char*) &locks_immediate, SHOW_LONG},
{"Table_locks_waited", (char*) &locks_waited, SHOW_LONG}, {"Table_locks_waited", (char*) &locks_waited, SHOW_LONG},

View File

@ -501,8 +501,8 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
select_distinct=0; select_distinct=0;
} }
else if (select_distinct && join.tables - join.const_tables == 1 && else if (select_distinct && join.tables - join.const_tables == 1 &&
((thd->select_limit == HA_POS_ERROR || (thd->select_limit == HA_POS_ERROR ||
(join.select_options & OPTION_FOUND_ROWS)) && (join.select_options & OPTION_FOUND_ROWS) ||
order && order &&
!(skip_sort_order= !(skip_sort_order=
test_if_skip_sort_order(&join.join_tab[join.const_tables], test_if_skip_sort_order(&join.join_tab[join.const_tables],
@ -4899,11 +4899,12 @@ end_send(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
JOIN_TAB *jt=join->join_tab; JOIN_TAB *jt=join->join_tab;
if ((join->tables == 1) && !join->tmp_table && !join->sort_and_group if ((join->tables == 1) && !join->tmp_table && !join->sort_and_group
&& !join->send_group_parts && !join->having && !jt->select_cond && && !join->send_group_parts && !join->having && !jt->select_cond &&
!(jt->table->file->table_flags() & HA_NOT_EXACT_COUNT) && (jt->records < INT_MAX32)) !(jt->table->file->table_flags() & HA_NOT_EXACT_COUNT))
{ {
/* Join over all rows in table; Return number of found rows */ /* Join over all rows in table; Return number of found rows */
join->select_options ^= OPTION_FOUND_ROWS; join->select_options ^= OPTION_FOUND_ROWS;
join->send_records = jt->records; jt->table->file->info(HA_STATUS_VARIABLE);
join->send_records = jt->table->file->records;
} }
else else
{ {
@ -4941,10 +4942,9 @@ end_send_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
join->procedure->end_group(); join->procedure->end_group();
if (idx < (int) join->send_group_parts) if (idx < (int) join->send_group_parts)
{ {
int error; int error=0;
if (join->procedure) if (join->procedure)
{ {
error=0;
if (join->having && join->having->val_int() == 0) if (join->having && join->having->val_int() == 0)
error= -1; // Didn't satisfy having error= -1; // Didn't satisfy having
else if (join->do_send_rows) else if (join->do_send_rows)
@ -4962,13 +4962,11 @@ end_send_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
} }
if (join->having && join->having->val_int() == 0) if (join->having && join->having->val_int() == 0)
error= -1; // Didn't satisfy having error= -1; // Didn't satisfy having
else else if (join->do_send_rows)
error=join->result->send_data(*join->fields) ? 1 : 0; error=join->result->send_data(*join->fields) ? 1 : 0;
} }
if (error > 0) if (error > 0)
DBUG_RETURN(-1); /* purecov: inspected */ DBUG_RETURN(-1); /* purecov: inspected */
if (end_of_records)
DBUG_RETURN(0);
if (!error && ++join->send_records >= join->thd->select_limit && if (!error && ++join->send_records >= join->thd->select_limit &&
join->do_send_rows) join->do_send_rows)
{ {
@ -4977,6 +4975,8 @@ end_send_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
join->do_send_rows=0; join->do_send_rows=0;
join->thd->select_limit = HA_POS_ERROR; join->thd->select_limit = HA_POS_ERROR;
} }
if (end_of_records)
DBUG_RETURN(0);
} }
} }
else else