mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +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:
168
Docs/manual.texi
168
Docs/manual.texi
@ -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
|
||||
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
|
||||
@code{DELETE FROM merge_table} used without a @code{WHERE}
|
||||
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
|
||||
* Default privileges:: Setting Up the Initial MySQL Privileges
|
||||
* Adding users:: Adding New Users to MySQL
|
||||
* User resources::
|
||||
* Passwords:: Setting Up Passwords
|
||||
* Password security:: Keeping Your Password Secure
|
||||
* Secure connections:: Using Secure Connections
|
||||
@ -16417,7 +16423,8 @@ GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...]
|
||||
[CIPHER cipher [AND]]
|
||||
[ISSUER issuer [AND]]
|
||||
[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)] ...]
|
||||
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
|
||||
users with different privileges may be able to join privileges!
|
||||
|
||||
@code{MAX_QUERIES_PER_HOUR=#} limits the number of queries the user can
|
||||
do during one hour. If @code{#} is 0, then this means that there is no
|
||||
limit of the number of queries. This works by MySQL resetting a user
|
||||
specific query counter to 0, after it has gone more than one hour
|
||||
since the counter started incrementing.
|
||||
@code{MAX_QUERIES_PER_HOUR=#}, @code{MAX_UPDATES_PER_HOUR=#} and
|
||||
@code{MAX_CONNECTIONS_PER_HOUR=#} limits the limits the number of
|
||||
queries/updates and logins the user can do during one hour.
|
||||
If @code{#} is 0 (default), then this means that there is no limitations
|
||||
for the user. @xref{User resources}.
|
||||
|
||||
You cannot grant another user a privilege you don't have yourself;
|
||||
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}.
|
||||
|
||||
|
||||
@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
|
||||
|
||||
@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/}).
|
||||
|
||||
|
||||
@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
|
||||
|
||||
@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_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{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_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,
|
||||
@ -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
|
||||
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.
|
||||
@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.
|
||||
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.
|
||||
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
|
||||
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_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.
|
||||
@ -19406,6 +19481,7 @@ have.
|
||||
@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{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_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.)
|
||||
@ -19414,12 +19490,14 @@ have.
|
||||
@item @code{Questions} @tab Number of queries sent to the server.
|
||||
@item @code{Slave_open_temp_tables} @tab Number of temporary tables currently
|
||||
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_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_range} @tab Number of sorts that where done with ranges.
|
||||
@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{ssl_xxx} @tab Variables used by SSL; Not yet implemented.
|
||||
@item @code{Table_locks_immediate} @tab Number of times a table lock was
|
||||
acquired immediately. Available after 3.23.33.
|
||||
@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
|
||||
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.
|
||||
|
||||
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
|
||||
@item
|
||||
Fixed bug in DROP DATABASE with symlink
|
||||
Fixed bug in @code{DROP DATABASE} with symlink
|
||||
@item
|
||||
Fixed bug in EXPLAIN with LIMIT offset != 0
|
||||
Fixed bug in @code{EXPLAIN} with @code{LIMIT offset != 0}
|
||||
@item
|
||||
|
||||
New feature :
|
||||
|
||||
Management of user resources
|
||||
|
||||
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.
|
||||
|
||||
Fixed bug in @code{SELECT SQL_CALC_FOUND_ROWS DISTINCT ... LIMIT #}
|
||||
@item
|
||||
Added limiting of user resources like queries per hour, updates per hour
|
||||
and connections made per hour.
|
||||
@item
|
||||
New configure option --without-query-cache.
|
||||
@item
|
||||
@ -55339,7 +55359,7 @@ New math functions:
|
||||
The @code{configure} source now compiles a thread-free client library
|
||||
@code{-lmysqlclient}. This is the only library that needs to be linked
|
||||
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
|
||||
New @code{readline} library from @code{bash-2.0}.
|
||||
@item
|
||||
|
@ -122,7 +122,6 @@ MYSQL_MANAGER* STDCALL mysql_manager_connect(MYSQL_MANAGER* con,
|
||||
memcpy_fixed(&sock_addr.sin_addr,&ip_addr,sizeof(ip_addr));
|
||||
}
|
||||
else
|
||||
#if defined(HAVE_GETHOSTBYNAME_R) && defined(_REENTRANT) && defined(THREAD)
|
||||
{
|
||||
int tmp_errno;
|
||||
struct hostent tmp_hostent,*hp;
|
||||
@ -133,22 +132,12 @@ MYSQL_MANAGER* STDCALL mysql_manager_connect(MYSQL_MANAGER* con,
|
||||
{
|
||||
con->last_errno=tmp_errno;
|
||||
sprintf(con->last_error,"Could not resolve host '%s'",host);
|
||||
my_gethostbyname_r_free();
|
||||
goto err;
|
||||
}
|
||||
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);
|
||||
if (my_connect(sock,(struct sockaddr *) &sock_addr, sizeof(sock_addr),
|
||||
0) <0)
|
||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -3734,12 +3734,12 @@ struct show_var_st status_vars[]= {
|
||||
{"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_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_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_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_tables", (char*) (com_stat+(uint) SQLCOM_SHOW_TABLES),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_scan", (char*) &filesort_scan_count, SHOW_LONG},
|
||||
#ifdef HAVE_OPENSSL
|
||||
{"ssl_accepts", (char*) 0, SHOW_SSL_CTX_SESS_ACCEPT},
|
||||
{"ssl_finished_accepts", (char*) 0, SHOW_SSL_CTX_SESS_ACCEPT_GOOD},
|
||||
{"ssl_finished_connects", (char*) 0, SHOW_SSL_CTX_SESS_CONNECT_GOOD},
|
||||
{"ssl_accept_renegotiates", (char*) 0, SHOW_SSL_CTX_SESS_ACCEPT_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_session_cache_hits", (char*) 0, SHOW_SSL_CTX_SESS_HITS},
|
||||
{"ssl_session_cache_misses", (char*) 0, SHOW_SSL_CTX_SESS_MISSES},
|
||||
{"ssl_session_cache_timeouts", (char*) 0, SHOW_SSL_CTX_SESS_TIMEOUTS},
|
||||
{"ssl_used_session_cache_entries",(char*) 0, SHOW_SSL_CTX_SESS_NUMBER},
|
||||
{"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_size", (char*) 0, SHOW_SSL_CTX_SESS_GET_CACHE_SIZE},
|
||||
{"ssl_session_cache_mode", (char*) 0, SHOW_SSL_CTX_GET_SESSION_CACHE_MODE},
|
||||
{"ssl_sessions_reused", (char*) 0, SHOW_SSL_SESSION_REUSED},
|
||||
{"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_verify_mode", (char*) 0, SHOW_SSL_GET_VERIFY_MODE},
|
||||
{"ssl_verify_depth", (char*) 0, SHOW_SSL_GET_VERIFY_DEPTH},
|
||||
{"ssl_version", (char*) 0, SHOW_SSL_GET_VERSION},
|
||||
{"ssl_cipher", (char*) 0, SHOW_SSL_GET_CIPHER},
|
||||
{"ssl_cipher_list", (char*) 0, SHOW_SSL_GET_CIPHER_LIST},
|
||||
{"ssl_default_timeout", (char*) 0, SHOW_SSL_GET_DEFAULT_TIMEOUT},
|
||||
{"Ssl_accepts", (char*) 0, SHOW_SSL_CTX_SESS_ACCEPT},
|
||||
{"Ssl_finished_accepts", (char*) 0, SHOW_SSL_CTX_SESS_ACCEPT_GOOD},
|
||||
{"Ssl_finished_connects", (char*) 0, SHOW_SSL_CTX_SESS_CONNECT_GOOD},
|
||||
{"Ssl_accept_renegotiates", (char*) 0, SHOW_SSL_CTX_SESS_ACCEPT_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_session_cache_hits", (char*) 0, SHOW_SSL_CTX_SESS_HITS},
|
||||
{"Ssl_session_cache_misses", (char*) 0, SHOW_SSL_CTX_SESS_MISSES},
|
||||
{"Ssl_session_cache_timeouts", (char*) 0, SHOW_SSL_CTX_SESS_TIMEOUTS},
|
||||
{"Ssl_used_session_cache_entries",(char*) 0, SHOW_SSL_CTX_SESS_NUMBER},
|
||||
{"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_size", (char*) 0, SHOW_SSL_CTX_SESS_GET_CACHE_SIZE},
|
||||
{"Ssl_session_cache_mode", (char*) 0, SHOW_SSL_CTX_GET_SESSION_CACHE_MODE},
|
||||
{"Ssl_sessions_reused", (char*) 0, SHOW_SSL_SESSION_REUSED},
|
||||
{"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_verify_mode", (char*) 0, SHOW_SSL_GET_VERIFY_MODE},
|
||||
{"Ssl_verify_depth", (char*) 0, SHOW_SSL_GET_VERIFY_DEPTH},
|
||||
{"Ssl_version", (char*) 0, SHOW_SSL_GET_VERSION},
|
||||
{"Ssl_cipher", (char*) 0, SHOW_SSL_GET_CIPHER},
|
||||
{"Ssl_cipher_list", (char*) 0, SHOW_SSL_GET_CIPHER_LIST},
|
||||
{"Ssl_default_timeout", (char*) 0, SHOW_SSL_GET_DEFAULT_TIMEOUT},
|
||||
#endif /* HAVE_OPENSSL */
|
||||
{"Table_locks_immediate", (char*) &locks_immediate, SHOW_LONG},
|
||||
{"Table_locks_waited", (char*) &locks_waited, SHOW_LONG},
|
||||
|
@ -501,8 +501,8 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
|
||||
select_distinct=0;
|
||||
}
|
||||
else if (select_distinct && join.tables - join.const_tables == 1 &&
|
||||
((thd->select_limit == HA_POS_ERROR ||
|
||||
(join.select_options & OPTION_FOUND_ROWS)) &&
|
||||
(thd->select_limit == HA_POS_ERROR ||
|
||||
(join.select_options & OPTION_FOUND_ROWS) ||
|
||||
order &&
|
||||
!(skip_sort_order=
|
||||
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;
|
||||
if ((join->tables == 1) && !join->tmp_table && !join->sort_and_group
|
||||
&& !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->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
|
||||
{
|
||||
@ -4941,10 +4942,9 @@ end_send_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
|
||||
join->procedure->end_group();
|
||||
if (idx < (int) join->send_group_parts)
|
||||
{
|
||||
int error;
|
||||
int error=0;
|
||||
if (join->procedure)
|
||||
{
|
||||
error=0;
|
||||
if (join->having && join->having->val_int() == 0)
|
||||
error= -1; // Didn't satisfy having
|
||||
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)
|
||||
error= -1; // Didn't satisfy having
|
||||
else
|
||||
else if (join->do_send_rows)
|
||||
error=join->result->send_data(*join->fields) ? 1 : 0;
|
||||
}
|
||||
if (error > 0)
|
||||
DBUG_RETURN(-1); /* purecov: inspected */
|
||||
if (end_of_records)
|
||||
DBUG_RETURN(0);
|
||||
if (!error && ++join->send_records >= join->thd->select_limit &&
|
||||
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->thd->select_limit = HA_POS_ERROR;
|
||||
}
|
||||
if (end_of_records)
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
Reference in New Issue
Block a user