Commit afe8d4fc authored by unknown's avatar unknown

Merge work:/my/mysql-4.0 into mashka.mysql.fi:/home/my/mysql-4.0


Docs/manual.texi:
  Auto merged
sql/ha_innodb.cc:
  Auto merged
sql/ha_innodb.h:
  Auto merged
parents 3c438bea 9ce6267e
...@@ -19751,24 +19751,27 @@ The output resembles that shown here, though the format and numbers may ...@@ -19751,24 +19751,27 @@ The output resembles that shown here, though the format and numbers may
differ somewhat: differ somewhat:
@example @example
+------------------------------+---------------------------+ +---------------------------------+------------------------------+
| Variable_name | Value | | Variable_name | Value |
+------------------------------+---------------------------+ +---------------------------------+------------------------------|
| ansi_mode | OFF |
| back_log | 50 | | back_log | 50 |
| basedir | /my/monty/ | | basedir | /usr/local/mysql |
| bdb_cache_size | 16777216 | | bdb_cache_size | 8388572 |
| bdb_log_buffer_size | 32768 | | bdb_log_buffer_size | 32768 |
| bdb_home | /my/monty/data/ | | bdb_home | /usr/local/mysql |
| bdb_max_lock | 10000 | | bdb_max_lock | 10000 |
| bdb_logdir | | | bdb_logdir | |
| bdb_shared_data | OFF | | bdb_shared_data | OFF |
| bdb_tmpdir | /tmp/ | | bdb_tmpdir | /tmp/ |
| bdb_version | Sleepycat Software: ... |
| binlog_cache_size | 32768 | | binlog_cache_size | 32768 |
| bulk_insert_buffer_size | 8388608 | | bulk_insert_buffer_size | 8388608 |
| character_set | latin1 |
| character_sets | latin1 big5 czech euc_kr |
| concurrent_insert | ON | | concurrent_insert | ON |
| connect_timeout | 5 | | connect_timeout | 5 |
| datadir | /my/monty/data/ | | convert_character_set | |
| datadir | /usr/local/mysql/data/ |
| delay_key_write | ON | | delay_key_write | ON |
| delayed_insert_limit | 100 | | delayed_insert_limit | 100 |
| delayed_insert_timeout | 300 | | delayed_insert_timeout | 300 |
...@@ -19778,65 +19781,100 @@ differ somewhat: ...@@ -19778,65 +19781,100 @@ differ somewhat:
| ft_min_word_len | 4 | | ft_min_word_len | 4 |
| ft_max_word_len | 254 | | ft_max_word_len | 254 |
| ft_max_word_len_for_sort | 20 | | ft_max_word_len_for_sort | 20 |
| ft_boolean_syntax | + -><()~* | | ft_boolean_syntax | + -><()~*:""&| |
| have_bdb | YES | | have_bdb | YES |
| have_innodb | YES | | have_innodb | YES |
| have_raid | YES | | have_isam | YES |
| have_openssl | NO | | have_raid | NO |
| have_symlink | DISABLED |
| have_openssl | YES |
| have_query_cache | YES |
| init_file | | | init_file | |
| innodb_additional_mem_pool_size | 1048576 |
| innodb_buffer_pool_size | 8388608 |
| innodb_data_file_path | ibdata1:10M:autoextend |
| innodb_data_home_dir | |
| innodb_file_io_threads | 4 |
| innodb_force_recovery | 0 |
| innodb_thread_concurrency | 8 |
| innodb_flush_log_at_trx_commit | 0 |
| innodb_fast_shutdown | ON |
| innodb_flush_method | |
| innodb_lock_wait_timeout | 50 |
| innodb_log_arch_dir | |
| innodb_log_archive | OFF |
| innodb_log_buffer_size | 1048576 |
| innodb_log_file_size | 5242880 |
| innodb_log_files_in_group | 2 |
| innodb_log_group_home_dir | ./ |
| innodb_mirrored_log_groups | 1 |
| interactive_timeout | 28800 | | interactive_timeout | 28800 |
| join_buffer_size | 131072 | | join_buffer_size | 131072 |
| key_buffer_size | 16776192 | | key_buffer_size | 16773120 |
| language | /my/monty/share/english/ | | language | /usr/local/mysql/share/... |
| large_files_support | ON | | large_files_support | ON |
| local_infile | ON |
| locked_in_memory | OFF |
| log | OFF | | log | OFF |
| log_update | OFF | | log_update | OFF |
| log_bin | OFF | | log_bin | OFF |
| log_slave_updates | OFF | | log_slave_updates | OFF |
| log_slow_queries | OFF |
| log_warnings | OFF |
| long_query_time | 10 | | long_query_time | 10 |
| low_priority_updates | OFF | | low_priority_updates | OFF |
| lower_case_table_names | 0 | | lower_case_table_names | OFF |
| max_allowed_packet | 1048576 | | max_allowed_packet | 1047552 |
| max_binlog_cache_size | 4294967295 | | max_binlog_cache_size | 4294967295 |
| max_binlog_size | 1073741824 |
| max_connections | 100 | | max_connections | 100 |
| max_connect_errors | 10 | | max_connect_errors | 10 |
| max_delayed_threads | 20 | | max_delayed_threads | 20 |
| max_heap_table_size | 16777216 | | max_heap_table_size | 16777216 |
| max_join_size | 4294967295 | | max_join_size | 4294967295 |
| max_sort_length | 1024 | | max_sort_length | 1024 |
| max_user_connections | 0 |
| max_tmp_tables | 32 | | max_tmp_tables | 32 |
| max_write_lock_count | 4294967295 | | max_write_lock_count | 4294967295 |
| myisam_recover_options | DEFAULT | | myisam_max_extra_sort_file_size | 268435456 |
| myisam_max_sort_file_size | 2147483647 |
| myisam_recover_options | force |
| myisam_sort_buffer_size | 8388608 | | myisam_sort_buffer_size | 8388608 |
| net_buffer_length | 16384 | | net_buffer_length | 16384 |
| net_read_timeout | 30 | | net_read_timeout | 30 |
| net_retry_count | 10 | | net_retry_count | 10 |
| net_write_timeout | 60 | | net_write_timeout | 60 |
| open_files_limit | 0 | | open_files_limit | 0 |
| pid_file | /my/monty/data/donna.pid | | pid_file | /usr/local/mysql/name.pid |
| port | 3306 | | port | 3306 |
| protocol_version | 10 | | protocol_version | 10 |
| read_buffer_size | 131072 | | read_buffer_size | 131072 |
| read_rnd_buffer_size | 262144 |
| rpl_recovery_rank | 0 |
| query_cache_limit | 1048576 | | query_cache_limit | 1048576 |
| query_cache_size | 16768060 | | query_cache_size | 0 |
| query_cache_type | 1 | | query_cache_type | ON |
| safe_show_database | OFF | | safe_show_database | OFF |
| server_id | 0 | | server_id | 0 |
| skip_locking | ON | | slave_net_timeout | 3600 |
| skip_external_locking | ON |
| skip_networking | OFF | | skip_networking | OFF |
| skip_show_database | OFF | | skip_show_database | OFF |
| slow_launch_time | 2 | | slow_launch_time | 2 |
| socket | /tmp/mysql.sock | | socket | /tmp/mysql.sock |
| sort_buffer | 2097116 | | sort_buffer_size | 2097116 |
| sql_mode | 0 |
| table_cache | 64 | | table_cache | 64 |
| table_type | MYISAM | | table_type | MYISAM |
| thread_cache_size | 4 | | thread_cache_size | 3 |
| thread_stack | 65536 | | thread_stack | 131072 |
| tmp_table_size | 1048576 | | tx_isolation | READ-COMMITTED |
| timezone | EEST |
| tmp_table_size | 33554432 |
| tmpdir | /tmp/ | | tmpdir | /tmp/ |
| version | 3.23.29a-gamma-debug | | version | 4.0.4-beta |
| wait_timeout | 28800 | | wait_timeout | 28800 |
+------------------------------+---------------------------+ +---------------------------------+------------------------------+
@end example @end example
Each option is described here. Values for buffer sizes, lengths, and stack Each option is described here. Values for buffer sizes, lengths, and stack
...@@ -20339,8 +20377,13 @@ The directory used for temporary files and temporary tables. ...@@ -20339,8 +20377,13 @@ The directory used for temporary files and temporary tables.
The version number for the server. The version number for the server.
@item @code{wait_timeout} @item @code{wait_timeout}
The number of seconds the server waits for activity on a connection before The number of seconds the server waits for activity on a not interactive
closing it. See also @code{interactive_timeout}. connection before closing it.
On thread startup @code{SESSION.WAIT_TIMEOUT} is initialised from
@code{GLOBAL.WAIT_TIMEOUT} or @code{GLOBAL.INTERACTIVE_TIMEOUT} depending
on the type of client (as defined by the @code{CLIENT_INTERACTIVE} connect
option). See also @code{interactive_timeout}.
@end itemize @end itemize
The manual section that describes tuning MySQL contains some The manual section that describes tuning MySQL contains some
...@@ -39502,6 +39545,9 @@ transaction. ...@@ -39502,6 +39545,9 @@ transaction.
* InnoDB Locks set:: Locks Set by Different SQL Statements in InnoDB * InnoDB Locks set:: Locks Set by Different SQL Statements in InnoDB
* InnoDB Deadlock detection:: Deadlock Detection and Rollback * InnoDB Deadlock detection:: Deadlock Detection and Rollback
* InnoDB Consistent read example:: An Example of How the Consistent Read Works in InnoDB * InnoDB Consistent read example:: An Example of How the Consistent Read Works in InnoDB
* Innodb deadlocks::
* Innodb tuning::
* Innodb Monitor::
@end menu @end menu
...@@ -39722,7 +39768,7 @@ set by the SQL statement may be preserved. This is because InnoDB ...@@ -39722,7 +39768,7 @@ set by the SQL statement may be preserved. This is because InnoDB
stores row locks in a format where it cannot afterwards know which was stores row locks in a format where it cannot afterwards know which was
set by which SQL statement. set by which SQL statement.
@node InnoDB Consistent read example, , InnoDB Deadlock detection, InnoDB transaction model @node InnoDB Consistent read example, Innodb deadlocks, InnoDB Deadlock detection, InnoDB transaction model
@subsubsection An Example of How the Consistent Read Works in InnoDB @subsubsection An Example of How the Consistent Read Works in InnoDB
When you issue a consistent read, that is, an ordinary @code{SELECT} When you issue a consistent read, that is, an ordinary @code{SELECT}
...@@ -39771,6 +39817,7 @@ use a locking read: ...@@ -39771,6 +39817,7 @@ use a locking read:
SELECT * FROM t LOCK IN SHARE MODE; SELECT * FROM t LOCK IN SHARE MODE;
@end example @end example
@node Innodb deadlocks, Innodb tuning, InnoDB Consistent read example, InnoDB transaction model
@subsubsection How to cope with deadlocks? @subsubsection How to cope with deadlocks?
Deadlocks are a classic problem in transactional databases, Deadlocks are a classic problem in transactional databases,
...@@ -39815,7 +39862,8 @@ and @code{UNLOCK TABLES} implicitly ends the transaction in a ...@@ -39815,7 +39862,8 @@ and @code{UNLOCK TABLES} implicitly ends the transaction in a
@code{COMMIT}. @code{COMMIT}.
@end itemize @end itemize
@subsection Performance Tuning Tips @node Innodb tuning, Innodb Monitor, Innodb deadlocks, InnoDB transaction model
@subsubsection Performance Tuning Tips
@strong{1.} @strong{1.}
If the Unix @file{top} or the Windows @file{Task Manager} shows that If the Unix @file{top} or the Windows @file{Task Manager} shows that
...@@ -39902,11 +39950,12 @@ INSERT INTO yourtable VALUES (1, 2), (5, 5); ...@@ -39902,11 +39950,12 @@ INSERT INTO yourtable VALUES (1, 2), (5, 5);
This tip is of course valid for inserts into any table type, not just InnoDB. This tip is of course valid for inserts into any table type, not just InnoDB.
@node Innodb Monitor, , Innodb tuning, InnoDB transaction model
@subsubsection The InnoDB Monitor @subsubsection The InnoDB Monitor
Starting from version 3.23.41 InnoDB includes the InnoDB Starting from version 3.23.41 InnoDB includes the InnoDB
Monitor which prints information on the InnoDB internal state. Monitor which prints information on the InnoDB internal state.
When swithed on, InnoDB Monitor When switched on, InnoDB Monitor
will make the MySQL server @file{mysqld} to print data will make the MySQL server @file{mysqld} to print data
(note: the MySQL client will not print anything) (note: the MySQL client will not print anything)
to the standard to the standard
...@@ -40153,13 +40202,12 @@ index. Note that if the primary key is long, the secondary indexes ...@@ -40153,13 +40202,12 @@ index. Note that if the primary key is long, the secondary indexes
will use more space. will use more space.
@menu @menu
* InnoDB physical structure:: Physical Structure of an Index * InnoDB physical structure::
* InnoDB Insert buffering:: Insert Buffering * InnoDB Insert buffering::
* InnoDB Adaptive hash:: Adaptive Hash Indexes * InnoDB Adaptive hash::
* InnoDB Physical record:: Physical Record Structure * InnoDB Physical record::
@end menu @end menu
@node InnoDB physical structure, InnoDB Insert buffering, Table and index, Table and index @node InnoDB physical structure, InnoDB Insert buffering, Table and index, Table and index
@subsubsection Physical Structure of an Index @subsubsection Physical Structure of an Index
...@@ -46135,7 +46183,7 @@ is not the case, you should run the script ...@@ -46135,7 +46183,7 @@ is not the case, you should run the script
@menu @menu
* UDF calling:: UDF Calling Sequences * UDF calling:: UDF Calling Sequences
* UDF aggr. calling :: UDF Calling Sequences for aggregate functions * UDF aggr. calling::
* UDF arguments:: Argument Processing * UDF arguments:: Argument Processing
* UDF return values:: Return Values and Error Handling * UDF return values:: Return Values and Error Handling
* UDF compiling:: Compiling and Installing User-definable Functions * UDF compiling:: Compiling and Installing User-definable Functions
...@@ -46252,7 +46300,7 @@ change! If you need memory, you should allocate it in @code{xxx_init()} ...@@ -46252,7 +46300,7 @@ change! If you need memory, you should allocate it in @code{xxx_init()}
and free it in @code{xxx_deinit()}. and free it in @code{xxx_deinit()}.
@node UDF calling, UDF aggr. calling , Adding UDF, Adding UDF @node UDF calling, UDF aggr. calling, Adding UDF, Adding UDF
@subsubsection UDF Calling Sequences for simple functions @subsubsection UDF Calling Sequences for simple functions
@cindex calling sequences for simple functions, UDF @cindex calling sequences for simple functions, UDF
...@@ -46395,7 +46443,7 @@ into @code{*error}! This is just a 1 byte flag! ...@@ -46395,7 +46443,7 @@ into @code{*error}! This is just a 1 byte flag!
If @code{isnull} or @code{error} are set after @code{xxx()} then MySQL If @code{isnull} or @code{error} are set after @code{xxx()} then MySQL
will return @code{NULL} as the result for the group function. will return @code{NULL} as the result for the group function.
@node UDF arguments, UDF return values, UDF aggr. calling , Adding UDF @node UDF arguments, UDF return values, UDF aggr. calling, Adding UDF
@subsubsection Argument Processing @subsubsection Argument Processing
@cindex argument processing @cindex argument processing
...@@ -47665,7 +47713,7 @@ limits! In this case you should start @code{safe_mysqld} with @code{sh}! ...@@ -47665,7 +47713,7 @@ limits! In this case you should start @code{safe_mysqld} with @code{sh}!
@menu @menu
* Link errors:: Problems When Linking with the MySQL Client Library * Link errors:: Problems When Linking with the MySQL Client Library
* Changing MySQL user:: How to Run MySQL As a Normal User * Changing MySQL user:: How to Run MySQL As a Normal User
* File permissions :: Problems with File Permissions * File permissions::
@end menu @end menu
@node Link errors, Changing MySQL user, Installation Issues, Installation Issues @node Link errors, Changing MySQL user, Installation Issues, Installation Issues
...@@ -47738,7 +47786,7 @@ before linking your code. In the second case you should be ...@@ -47738,7 +47786,7 @@ before linking your code. In the second case you should be
sure that no other programs are using the dynamic libraries! sure that no other programs are using the dynamic libraries!
@node Changing MySQL user, File permissions , Link errors, Installation Issues @node Changing MySQL user, File permissions, Link errors, Installation Issues
@appendixsubsec How to Run MySQL As a Normal User @appendixsubsec How to Run MySQL As a Normal User
@cindex starting, @code{mysqld} @cindex starting, @code{mysqld}
...@@ -47932,12 +47980,6 @@ check whether things that work for others crash for you. Please try ...@@ -47932,12 +47980,6 @@ check whether things that work for others crash for you. Please try
the following things: the following things:
@itemize @bullet @itemize @bullet
@item
Cleaned up @code{NULL} handling for default values in @code{DESCRIBE
table_name}.
@item
Fixed @code{truncate()} to round up negative values to the nearest integer.
@item
Take down the @code{mysqld} daemon with @code{mysqladmin shutdown}, run Take down the @code{mysqld} daemon with @code{mysqladmin shutdown}, run
@code{myisamchk --silent --force */*.MYI} on all tables, and restart the @code{myisamchk --silent --force */*.MYI} on all tables, and restart the
@code{mysqld} daemon. This will ensure that you are running from a clean @code{mysqld} daemon. This will ensure that you are running from a clean
...@@ -50398,6 +50440,13 @@ each individual 4.0.x release. ...@@ -50398,6 +50440,13 @@ each individual 4.0.x release.
@itemize @bullet @itemize @bullet
@item @item
Added @code{LOCK TABLES} and @code{CREATE TEMPORARY TABLES} privilege on
the database level. One must run the @code{ mysql_fix_privilege_tables}
script on old installations to activate these.
@item
In @code{SHOW TABLE ... STATUS} compressed tables showed sometimes up as
@code{dynamic}.
@item
@code{SELECT @@@@[global|session].var_name} didn't report @code{SELECT @@@@[global|session].var_name} didn't report
@code{global | session} in the result column name. @code{global | session} in the result column name.
@item @item
...@@ -50613,6 +50662,11 @@ other databases. It is synonymous with @code{LOG(X)}. ...@@ -50613,6 +50662,11 @@ other databases. It is synonymous with @code{LOG(X)}.
@itemize @bullet @itemize @bullet
@item @item
Cleaned up @code{NULL} handling for default values in @code{DESCRIBE
table_name}.
@item
Fixed @code{truncate()} to round up negative values to the nearest integer.
@item
Changed @code{--chroot=path} option to execute @code{chroot()} immediately Changed @code{--chroot=path} option to execute @code{chroot()} immediately
after all options have been parsed. after all options have been parsed.
@item @item
...@@ -51192,6 +51246,9 @@ Multithreaded stress tests for InnoDB. ...@@ -51192,6 +51246,9 @@ Multithreaded stress tests for InnoDB.
@appendixsubsec Changes in release 3.23.52 (14 Aug 2002) @appendixsubsec Changes in release 3.23.52 (14 Aug 2002)
@itemize @bullet @itemize @bullet
@item @item
Wrap @code{BEGIN}/@code{COMMIT} around transaction in the binary log.
This makes replication honour transactions.
@item
Fixed security bug when having an empty database name in the @code{user.db} Fixed security bug when having an empty database name in the @code{user.db}
table. table.
@item @item
...@@ -51293,6 +51350,9 @@ Linux-x86 binaries. ...@@ -51293,6 +51350,9 @@ Linux-x86 binaries.
@itemize @bullet @itemize @bullet
@item @item
Fixed buffer overflow problem if someone specified a too long datadir
parameter to mysqld
@item
Add missing @code{<row>} tags for @code{mysqldump} XML output. Add missing @code{<row>} tags for @code{mysqldump} XML output.
@item @item
Fixed problem with @code{crash-me} and @code{gcc} 3.0.4. Fixed problem with @code{crash-me} and @code{gcc} 3.0.4.
...@@ -175,7 +175,7 @@ struct st_VioSSLConnectorFd ...@@ -175,7 +175,7 @@ struct st_VioSSLConnectorFd
}; };
void sslaccept(struct st_VioSSLAcceptorFd*, Vio*, long timeout); void sslaccept(struct st_VioSSLAcceptorFd*, Vio*, long timeout);
void sslconnect(struct st_VioSSLConnectorFd*, Vio*, long timeout); int sslconnect(struct st_VioSSLConnectorFd*, Vio*, long timeout);
struct st_VioSSLConnectorFd struct st_VioSSLConnectorFd
*new_VioSSLConnectorFd(const char* key_file, const char* cert_file, *new_VioSSLConnectorFd(const char* key_file, const char* cert_file,
......
...@@ -302,6 +302,9 @@ btr_cur_search_to_nth_level( ...@@ -302,6 +302,9 @@ btr_cur_search_to_nth_level(
rw_lock_s_unlock(&btr_search_latch); rw_lock_s_unlock(&btr_search_latch);
} }
/* Store the position of the tree latch we push to mtr so that we
know how to release it when we have latched leaf node(s) */
savepoint = mtr_set_savepoint(mtr); savepoint = mtr_set_savepoint(mtr);
tree = index->tree; tree = index->tree;
...@@ -506,12 +509,18 @@ btr_cur_open_at_index_side( ...@@ -506,12 +509,18 @@ btr_cur_open_at_index_side(
ulint root_height = 0; /* remove warning */ ulint root_height = 0; /* remove warning */
rec_t* node_ptr; rec_t* node_ptr;
ulint estimate; ulint estimate;
ulint savepoint;
estimate = latch_mode & BTR_ESTIMATE; estimate = latch_mode & BTR_ESTIMATE;
latch_mode = latch_mode & ~BTR_ESTIMATE; latch_mode = latch_mode & ~BTR_ESTIMATE;
tree = index->tree; tree = index->tree;
/* Store the position of the tree latch we push to mtr so that we
know how to release it when we have latched the leaf node */
savepoint = mtr_set_savepoint(mtr);
if (latch_mode == BTR_MODIFY_TREE) { if (latch_mode == BTR_MODIFY_TREE) {
mtr_x_lock(dict_tree_get_lock(tree), mtr); mtr_x_lock(dict_tree_get_lock(tree), mtr);
} else { } else {
...@@ -544,6 +553,22 @@ btr_cur_open_at_index_side( ...@@ -544,6 +553,22 @@ btr_cur_open_at_index_side(
if (height == 0) { if (height == 0) {
btr_cur_latch_leaves(tree, page, space, page_no, btr_cur_latch_leaves(tree, page, space, page_no,
latch_mode, cursor, mtr); latch_mode, cursor, mtr);
/* In versions <= 3.23.52 we had forgotten to
release the tree latch here. If in an index scan
we had to scan far to find a record visible to the
current transaction, that could starve others
waiting for the tree latch. */
if ((latch_mode != BTR_MODIFY_TREE)
&& (latch_mode != BTR_CONT_MODIFY_TREE)) {
/* Release the tree s-latch */
mtr_release_s_latch_at_savepoint(
mtr, savepoint,
dict_tree_get_lock(tree));
}
} }
if (from_left) { if (from_left) {
......
...@@ -2278,7 +2278,7 @@ consecutive_loop: ...@@ -2278,7 +2278,7 @@ consecutive_loop:
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fprintf(stderr, fprintf(stderr,
" InnoDB: ERROR: The page to be written seems corrupt!\n"); " InnoDB: ERROR: The page to be written seems corrupt!\n");
page_print(combined_buf + len2); buf_page_print(combined_buf + len2);
fprintf(stderr, fprintf(stderr,
"InnoDB: ERROR: The page to be written seems corrupt!\n"); "InnoDB: ERROR: The page to be written seems corrupt!\n");
} }
......
...@@ -49,6 +49,12 @@ os_event_create( ...@@ -49,6 +49,12 @@ os_event_create(
TRUE, /* Manual reset */ TRUE, /* Manual reset */
FALSE, /* Initial state nonsignaled */ FALSE, /* Initial state nonsignaled */
name); name);
if (!event) {
fprintf(stderr,
"InnoDB: Could not create a Windows event semaphore; Windows error %lu\n",
(ulint)GetLastError());
}
ut_a(event); ut_a(event);
return(event); return(event);
......
...@@ -2825,7 +2825,11 @@ background_loop: ...@@ -2825,7 +2825,11 @@ background_loop:
srv_main_thread_op_info = (char*)"purging"; srv_main_thread_op_info = (char*)"purging";
if (srv_fast_shutdown && srv_shutdown_state > 0) {
n_pages_purged = 0;
} else {
n_pages_purged = trx_purge(); n_pages_purged = trx_purge();
}
srv_main_thread_op_info = (char*)"reserving kernel mutex"; srv_main_thread_op_info = (char*)"reserving kernel mutex";
...@@ -2837,7 +2841,12 @@ background_loop: ...@@ -2837,7 +2841,12 @@ background_loop:
mutex_exit(&kernel_mutex); mutex_exit(&kernel_mutex);
srv_main_thread_op_info = (char*)"doing insert buffer merge"; srv_main_thread_op_info = (char*)"doing insert buffer merge";
if (srv_fast_shutdown && srv_shutdown_state > 0) {
n_bytes_merged = 0;
} else {
n_bytes_merged = ibuf_contract_for_n_pages(TRUE, 20); n_bytes_merged = ibuf_contract_for_n_pages(TRUE, 20);
}
srv_main_thread_op_info = (char*)"reserving kernel mutex"; srv_main_thread_op_info = (char*)"reserving kernel mutex";
......
...@@ -924,7 +924,7 @@ sync_array_print_long_waits(void) ...@@ -924,7 +924,7 @@ sync_array_print_long_waits(void)
} }
if (cell->wait_object != NULL if (cell->wait_object != NULL
&& difftime(time(NULL), cell->reservation_time) > 420) { && difftime(time(NULL), cell->reservation_time) > 600) {
fprintf(stderr, fprintf(stderr,
"InnoDB: Error: semaphore wait has lasted > 600 seconds\n" "InnoDB: Error: semaphore wait has lasted > 600 seconds\n"
......
...@@ -401,6 +401,10 @@ trx_undo_seg_create( ...@@ -401,6 +401,10 @@ trx_undo_seg_create(
slot_no = trx_rsegf_undo_find_free(rseg_hdr, mtr); slot_no = trx_rsegf_undo_find_free(rseg_hdr, mtr);
if (slot_no == ULINT_UNDEFINED) { if (slot_no == ULINT_UNDEFINED) {
ut_print_timestamp(stderr);
fprintf(stderr,
"InnoDB: Warning: cannot find a free slot for an undo log. Do you have too\n"
"InnoDB: many active transactions running concurrently?");
return(NULL); return(NULL);
} }
...@@ -1532,9 +1536,6 @@ trx_undo_assign_undo( ...@@ -1532,9 +1536,6 @@ trx_undo_assign_undo(
mutex_exit(&(rseg->mutex)); mutex_exit(&(rseg->mutex));
mtr_commit(&mtr); mtr_commit(&mtr);
fprintf(stderr, "InnoDB: no undo log slots free\n");
ut_a(0);
return(NULL); return(NULL);
} }
} }
......
...@@ -514,6 +514,7 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups) ...@@ -514,6 +514,7 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups)
if (!opt_noacl) if (!opt_noacl)
(void) grant_init(); (void) grant_init();
init_max_user_conn(); init_max_user_conn();
init_update_queries();
#ifdef HAVE_DLOPEN #ifdef HAVE_DLOPEN
if (!opt_noacl) if (!opt_noacl)
......
#!/bin/sh #!/bin/sh
# Copyright (C) 1997, 1998, 1999 TCX DataKonsult AB & Monty Program KB & Detron HB # Copyright (C) 1997-2002 MySQL AB
# For a more info consult the file COPYRIGHT distributed with this file # For a more info consult the file COPYRIGHT distributed with this file
# This scripts creates the privilege tables db, host, user, tables_priv, # This scripts creates the privilege tables db, host, user, tables_priv,
...@@ -85,13 +85,15 @@ then ...@@ -85,13 +85,15 @@ then
c_d="$c_d References_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
c_d="$c_d Index_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
c_d="$c_d Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
c_d="$c_d Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
c_d="$c_d Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
c_d="$c_d PRIMARY KEY Host (Host,Db,User)," c_d="$c_d PRIMARY KEY Host (Host,Db,User),"
c_d="$c_d KEY User (User)" c_d="$c_d KEY User (User)"
c_d="$c_d )" c_d="$c_d )"
c_d="$c_d comment='Database privileges';" c_d="$c_d comment='Database privileges';"
i_d="INSERT INTO db VALUES ('%','test','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y'); i_d="INSERT INTO db VALUES ('%','test','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');
INSERT INTO db VALUES ('%','test\_%','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y');" INSERT INTO db VALUES ('%','test\_%','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');"
fi fi
if test ! -f $mdata/host.frm if test ! -f $mdata/host.frm
...@@ -109,6 +111,8 @@ then ...@@ -109,6 +111,8 @@ then
c_h="$c_h References_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
c_h="$c_h Index_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
c_h="$c_h Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
c_h="$c_h Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
c_h="$c_h Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
c_h="$c_h PRIMARY KEY Host (Host,Db)" c_h="$c_h PRIMARY KEY Host (Host,Db)"
c_h="$c_h )" c_h="$c_h )"
c_h="$c_h comment='Host privileges; Merged with database privileges';" c_h="$c_h comment='Host privileges; Merged with database privileges';"
......
...@@ -34,3 +34,27 @@ Grants for mysqltest_1@localhost ...@@ -34,3 +34,27 @@ Grants for mysqltest_1@localhost
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost' REQUIRE ISSUER 'MySQL AB' SUBJECT 'testsubject' CIPHER 'EDH-RSA-DES-CBC3-SHA' GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost' REQUIRE ISSUER 'MySQL AB' SUBJECT 'testsubject' CIPHER 'EDH-RSA-DES-CBC3-SHA'
delete from mysql.user where user='mysqltest_1'; delete from mysql.user where user='mysqltest_1';
flush privileges; flush privileges;
grant CREATE TEMPORARY TABLES, LOCK TABLES on mysqltest.* to mysqltest_1@localhost;
show grants for mysqltest_1@localhost;
Grants for mysqltest_1@localhost
GRANT CREATE TEMPORARY TABLES, LOCK TABLES ON `mysqltest`.* TO 'mysqltest_1'@'localhost'
flush privileges;
show grants for mysqltest_1@localhost;
Grants for mysqltest_1@localhost
GRANT CREATE TEMPORARY TABLES, LOCK TABLES ON `mysqltest`.* TO 'mysqltest_1'@'localhost'
revoke CREATE TEMPORARY TABLES on mysqltest.* from mysqltest_1@localhost;
show grants for mysqltest_1@localhost;
Grants for mysqltest_1@localhost
GRANT LOCK TABLES ON `mysqltest`.* TO 'mysqltest_1'@'localhost'
grant ALL PRIVILEGES on mysqltest.* to mysqltest_1@localhost with GRANT OPTION;
flush privileges;
show grants for mysqltest_1@localhost;
Grants for mysqltest_1@localhost
GRANT ALL PRIVILEGES ON `mysqltest`.* TO 'mysqltest_1'@'localhost' WITH GRANT OPTION
revoke LOCK TABLES, ALTER on mysqltest.* from mysqltest_1@localhost;
show grants for mysqltest_1@localhost;
Grants for mysqltest_1@localhost
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, CREATE TEMPORARY TABLES ON `mysqltest`.* TO 'mysqltest_1'@'localhost' WITH GRANT OPTION
revoke all privileges on mysqltest.* from mysqltest_1@localhost;
delete from mysql.user where user='mysqltest_1';
flush privileges;
drop table if exists t1,t2,t3;
create table T1 (id int primary key, Word varchar(40) not null, Index(Word));
INSERT INTO T1 VALUES (1, 'a'), (2, 'b'), (3, 'c');
SELECT * FROM t1;
id Word
1 a
2 b
3 c
RENAME TABLE T1 TO T2;
ALTER TABLE T2 ADD new_col int not null;
ALTER TABLE T2 RENAME T3;
show tables like 't_';
Tables_in_test (t_)
t3
drop table t3;
...@@ -20,3 +20,22 @@ revoke all privileges on mysqltest.* from mysqltest_1@localhost; ...@@ -20,3 +20,22 @@ revoke all privileges on mysqltest.* from mysqltest_1@localhost;
show grants for mysqltest_1@localhost; show grants for mysqltest_1@localhost;
delete from mysql.user where user='mysqltest_1'; delete from mysql.user where user='mysqltest_1';
flush privileges; flush privileges;
#
# Test that the new db privileges are stored/retrieved correctly
#
grant CREATE TEMPORARY TABLES, LOCK TABLES on mysqltest.* to mysqltest_1@localhost;
show grants for mysqltest_1@localhost;
flush privileges;
show grants for mysqltest_1@localhost;
revoke CREATE TEMPORARY TABLES on mysqltest.* from mysqltest_1@localhost;
show grants for mysqltest_1@localhost;
grant ALL PRIVILEGES on mysqltest.* to mysqltest_1@localhost with GRANT OPTION;
flush privileges;
show grants for mysqltest_1@localhost;
revoke LOCK TABLES, ALTER on mysqltest.* from mysqltest_1@localhost;
show grants for mysqltest_1@localhost;
revoke all privileges on mysqltest.* from mysqltest_1@localhost;
delete from mysql.user where user='mysqltest_1';
flush privileges;
#
# Test of --lower-case-table-names
#
drop table if exists t1,t2,t3;
create table T1 (id int primary key, Word varchar(40) not null, Index(Word));
INSERT INTO T1 VALUES (1, 'a'), (2, 'b'), (3, 'c');
SELECT * FROM t1;
RENAME TABLE T1 TO T2;
ALTER TABLE T2 ADD new_col int not null;
ALTER TABLE T2 RENAME T3;
show tables like 't_';
drop table t3;
...@@ -137,7 +137,7 @@ EOF ...@@ -137,7 +137,7 @@ EOF
echo "" echo ""
# #
# Change the user table to MySQL 4.0 format # Change the user,db and host tables to MySQL 4.0 format
# #
echo "Adding new fields used by MySQL 4.0.2 to the privilege tables" echo "Adding new fields used by MySQL 4.0.2 to the privilege tables"
...@@ -174,3 +174,16 @@ add max_questions int(11) NOT NULL AFTER x509_subject, ...@@ -174,3 +174,16 @@ add max_questions int(11) NOT NULL AFTER x509_subject,
add max_updates int(11) unsigned NOT NULL AFTER max_questions, add max_updates int(11) unsigned NOT NULL AFTER max_questions,
add max_connections int(11) unsigned NOT NULL AFTER max_updates; add max_connections int(11) unsigned NOT NULL AFTER max_updates;
END_OF_DATA END_OF_DATA
#
# Add Create_tmp_table_priv and Lock_tables_priv to db and host
#
@bindir@/mysql --user=root --password="$root_password" --host="$host" mysql <<END_OF_DATA
alter table db
add Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,
add Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL;
alter table host
add Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,
add Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL;
END_OF_DATA
...@@ -171,13 +171,15 @@ then ...@@ -171,13 +171,15 @@ then
c_d="$c_d References_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
c_d="$c_d Index_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
c_d="$c_d Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
c_d="$c_d Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
c_d="$c_d Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
c_d="$c_d PRIMARY KEY Host (Host,Db,User)," c_d="$c_d PRIMARY KEY Host (Host,Db,User),"
c_d="$c_d KEY User (User)" c_d="$c_d KEY User (User)"
c_d="$c_d )" c_d="$c_d )"
c_d="$c_d comment='Database privileges';" c_d="$c_d comment='Database privileges';"
i_d="INSERT INTO db VALUES ('%','test','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y'); i_d="INSERT INTO db VALUES ('%','test','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');
INSERT INTO db VALUES ('%','test\_%','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y');" INSERT INTO db VALUES ('%','test\_%','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');"
fi fi
if test ! -f $mdata/host.frm if test ! -f $mdata/host.frm
...@@ -197,6 +199,8 @@ then ...@@ -197,6 +199,8 @@ then
c_h="$c_h References_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
c_h="$c_h Index_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
c_h="$c_h Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
c_h="$c_h Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
c_h="$c_h Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
c_h="$c_h PRIMARY KEY Host (Host,Db)" c_h="$c_h PRIMARY KEY Host (Host,Db)"
c_h="$c_h )" c_h="$c_h )"
c_h="$c_h comment='Host privileges; Merged with database privileges';" c_h="$c_h comment='Host privileges; Merged with database privileges';"
......
...@@ -370,13 +370,18 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select, ...@@ -370,13 +370,18 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select,
{ {
if (write_keys(param,sort_keys,idx,buffpek_pointers,tempfile)) if (write_keys(param,sort_keys,idx,buffpek_pointers,tempfile))
DBUG_RETURN(HA_POS_ERROR); DBUG_RETURN(HA_POS_ERROR);
idx=0; indexpos++; idx=0;
if (param->ref_length == param->sort_length && if (param->ref_length == param->sort_length &&
my_b_tell(tempfile)/param->sort_length >= param->max_rows) my_b_tell(tempfile)/param->sort_length >= param->max_rows)
{ {
/*
We are writing the result index file and have found all
rows that we need. Abort the sort and return the result.
*/
error=HA_ERR_END_OF_FILE; error=HA_ERR_END_OF_FILE;
break; /* Found enough records */ break; /* Found enough records */
} }
indexpos++;
} }
make_sortkey(param,sort_keys[idx++],ref_pos); make_sortkey(param,sort_keys[idx++],ref_pos);
} }
...@@ -391,7 +396,7 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select, ...@@ -391,7 +396,7 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select,
file->print_error(error,MYF(ME_ERROR | ME_WAITTANG)); /* purecov: inspected */ file->print_error(error,MYF(ME_ERROR | ME_WAITTANG)); /* purecov: inspected */
DBUG_RETURN(HA_POS_ERROR); /* purecov: inspected */ DBUG_RETURN(HA_POS_ERROR); /* purecov: inspected */
} }
if (indexpos && if (indexpos && idx &&
write_keys(param,sort_keys,idx,buffpek_pointers,tempfile)) write_keys(param,sort_keys,idx,buffpek_pointers,tempfile))
DBUG_RETURN(HA_POS_ERROR); /* purecov: inspected */ DBUG_RETURN(HA_POS_ERROR); /* purecov: inspected */
DBUG_RETURN(my_b_inited(tempfile) ? DBUG_RETURN(my_b_inited(tempfile) ?
...@@ -759,7 +764,11 @@ int merge_buffers(SORTPARAM *param, IO_CACHE *from_file, ...@@ -759,7 +764,11 @@ int merge_buffers(SORTPARAM *param, IO_CACHE *from_file,
} }
buffpek->key+=sort_length; buffpek->key+=sort_length;
buffpek->mem_count--; buffpek->mem_count--;
max_rows--; if (!--max_rows)
{
error=0; /* purecov: inspected */
goto end; /* purecov: inspected */
}
queue_replaced(&queue); // Top element has been used queue_replaced(&queue); // Top element has been used
} }
else else
......
...@@ -101,11 +101,18 @@ char* innobase_unix_file_flush_method = NULL; ...@@ -101,11 +101,18 @@ char* innobase_unix_file_flush_method = NULL;
/* Below we have boolean-valued start-up parameters, and their default /* Below we have boolean-valued start-up parameters, and their default
values */ values */
uint innobase_flush_log_at_trx_commit = 0;
my_bool innobase_log_archive = FALSE; my_bool innobase_log_archive = FALSE;
my_bool innobase_use_native_aio = FALSE; my_bool innobase_use_native_aio = FALSE;
my_bool innobase_fast_shutdown = TRUE; my_bool innobase_fast_shutdown = TRUE;
/* innodb_flush_log_at_trx_commit can now have 3 values:
0 : write to the log file once per second and flush it to disk;
1 : write to the log file at each commit and flush it to disk;
2 : write to the log file at each commit, but flush to disk only once per
second */
uint innobase_flush_log_at_trx_commit = 0;
/* /*
Set default InnoDB data file size to 10 MB and let it be Set default InnoDB data file size to 10 MB and let it be
auto-extending. Thus users can use InnoDB without having to auto-extending. Thus users can use InnoDB without having to
......
...@@ -309,6 +309,7 @@ void mysql_init_select(LEX *lex); ...@@ -309,6 +309,7 @@ void mysql_init_select(LEX *lex);
bool mysql_new_select(LEX *lex); bool mysql_new_select(LEX *lex);
void mysql_init_multi_delete(LEX *lex); void mysql_init_multi_delete(LEX *lex);
void init_max_user_conn(void); void init_max_user_conn(void);
void init_update_queries(void);
void free_max_user_conn(void); void free_max_user_conn(void);
pthread_handler_decl(handle_one_connection,arg); pthread_handler_decl(handle_one_connection,arg);
pthread_handler_decl(handle_bootstrap,arg); pthread_handler_decl(handle_bootstrap,arg);
...@@ -676,11 +677,14 @@ extern SHOW_COMP_OPTION have_isam, have_innodb, have_berkeley_db; ...@@ -676,11 +677,14 @@ extern SHOW_COMP_OPTION have_isam, have_innodb, have_berkeley_db;
extern SHOW_COMP_OPTION have_raid, have_openssl, have_symlink; extern SHOW_COMP_OPTION have_raid, have_openssl, have_symlink;
extern SHOW_COMP_OPTION have_query_cache, have_berkeley_db, have_innodb; extern SHOW_COMP_OPTION have_query_cache, have_berkeley_db, have_innodb;
#ifndef __WIN__ #ifndef __WIN__
extern pthread_t signal_thread; extern pthread_t signal_thread;
#endif #endif
#ifdef HAVE_OPENSSL
extern struct st_VioSSLAcceptorFd * ssl_acceptor_fd;
#endif /* HAVE_OPENSSL */
MYSQL_LOCK *mysql_lock_tables(THD *thd,TABLE **table,uint count); MYSQL_LOCK *mysql_lock_tables(THD *thd,TABLE **table,uint count);
void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock); void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock);
void mysql_unlock_read_tables(THD *thd, MYSQL_LOCK *sql_lock); void mysql_unlock_read_tables(THD *thd, MYSQL_LOCK *sql_lock);
......
...@@ -2049,6 +2049,7 @@ int main(int argc, char **argv) ...@@ -2049,6 +2049,7 @@ int main(int argc, char **argv)
if (!opt_noacl) if (!opt_noacl)
(void) grant_init(); (void) grant_init();
init_max_user_conn(); init_max_user_conn();
init_update_queries();
#ifdef HAVE_DLOPEN #ifdef HAVE_DLOPEN
if (!opt_noacl) if (!opt_noacl)
...@@ -3036,10 +3037,10 @@ struct my_option my_long_options[] = ...@@ -3036,10 +3037,10 @@ struct my_option my_long_options[] =
"Set to 1 if you want to have logs archived", 0, 0, 0, GET_LONG, OPT_ARG, "Set to 1 if you want to have logs archived", 0, 0, 0, GET_LONG, OPT_ARG,
0, 0, 0, 0, 0, 0}, 0, 0, 0, 0, 0, 0},
{"innodb_flush_log_at_trx_commit", OPT_INNODB_FLUSH_LOG_AT_TRX_COMMIT, {"innodb_flush_log_at_trx_commit", OPT_INNODB_FLUSH_LOG_AT_TRX_COMMIT,
"Set to 0 if you don't want to flush logs", "Set to 0 (write and flush once per second), 1 (write and flush at each commit) or 2 (write at commit, flush once per second)",
(gptr*) &innobase_flush_log_at_trx_commit, (gptr*) &innobase_flush_log_at_trx_commit,
(gptr*) &innobase_flush_log_at_trx_commit, (gptr*) &innobase_flush_log_at_trx_commit,
0, GET_INT, OPT_ARG, 0, 0, 2, 0, 0, 0}, 0, GET_UINT, OPT_ARG, 0, 0, 2, 0, 0, 0},
{"innodb_flush_method", OPT_INNODB_FLUSH_METHOD, {"innodb_flush_method", OPT_INNODB_FLUSH_METHOD,
"With which method to flush data", (gptr*) &innobase_unix_file_flush_method, "With which method to flush data", (gptr*) &innobase_unix_file_flush_method,
(gptr*) &innobase_unix_file_flush_method, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, (gptr*) &innobase_unix_file_flush_method, 0, GET_STR, REQUIRED_ARG, 0, 0, 0,
......
...@@ -114,32 +114,6 @@ static void update_hostname(acl_host_and_ip *host, const char *hostname); ...@@ -114,32 +114,6 @@ static void update_hostname(acl_host_and_ip *host, const char *hostname);
static bool compare_hostname(const acl_host_and_ip *host, const char *hostname, static bool compare_hostname(const acl_host_and_ip *host, const char *hostname,
const char *ip); const char *ip);
extern char uc_update_queries[SQLCOM_END];
static void init_update_queries(void)
{
uc_update_queries[SQLCOM_CREATE_TABLE]=1;
uc_update_queries[SQLCOM_CREATE_INDEX]=1;
uc_update_queries[SQLCOM_ALTER_TABLE]=1;
uc_update_queries[SQLCOM_UPDATE]=1;
uc_update_queries[SQLCOM_INSERT]=1;
uc_update_queries[SQLCOM_INSERT_SELECT]=1;
uc_update_queries[SQLCOM_DELETE]=1;
uc_update_queries[SQLCOM_TRUNCATE]=1;
uc_update_queries[SQLCOM_DROP_TABLE]=1;
uc_update_queries[SQLCOM_LOAD]=1;
uc_update_queries[SQLCOM_CREATE_DB]=1;
uc_update_queries[SQLCOM_DROP_DB]=1;
uc_update_queries[SQLCOM_REPLACE]=1;
uc_update_queries[SQLCOM_REPLACE_SELECT]=1;
uc_update_queries[SQLCOM_RENAME_TABLE]=1;
uc_update_queries[SQLCOM_BACKUP_TABLE]=1;
uc_update_queries[SQLCOM_RESTORE_TABLE]=1;
uc_update_queries[SQLCOM_DELETE_MULTI]=1;
uc_update_queries[SQLCOM_DROP_INDEX]=1;
uc_update_queries[SQLCOM_MULTI_UPDATE]=1;
}
/* /*
Read grant privileges from the privilege tables in the 'mysql' database. Read grant privileges from the privilege tables in the 'mysql' database.
...@@ -214,7 +188,7 @@ my_bool acl_init(bool dont_read_acl_tables) ...@@ -214,7 +188,7 @@ my_bool acl_init(bool dont_read_acl_tables)
if (table->fields == 8) if (table->fields == 8)
{ // Without grant { // Without grant
if (host.access & CREATE_ACL) if (host.access & CREATE_ACL)
host.access|=REFERENCES_ACL | INDEX_ACL | ALTER_ACL; host.access|=REFERENCES_ACL | INDEX_ACL | ALTER_ACL | CREATE_TMP_ACL;
} }
#endif #endif
VOID(push_dynamic(&acl_hosts,(gptr) &host)); VOID(push_dynamic(&acl_hosts,(gptr) &host));
...@@ -350,7 +324,6 @@ my_bool acl_init(bool dont_read_acl_tables) ...@@ -350,7 +324,6 @@ my_bool acl_init(bool dont_read_acl_tables)
mysql_unlock_tables(thd, lock); mysql_unlock_tables(thd, lock);
initialized=1; initialized=1;
init_update_queries();
thd->version--; // Force close to free memory thd->version--; // Force close to free memory
return_val=0; return_val=0;
...@@ -1339,6 +1312,7 @@ static int replace_user_table(THD *thd, TABLE *table, const LEX_USER &combo, ...@@ -1339,6 +1312,7 @@ static int replace_user_table(THD *thd, TABLE *table, const LEX_USER &combo,
strlen(thd->lex.x509_subject)); strlen(thd->lex.x509_subject));
break; break;
case SSL_TYPE_NOT_SPECIFIED: case SSL_TYPE_NOT_SPECIFIED:
case SSL_TYPE_NONE: // Impossible
break; // Nothing to do break; // Nothing to do
} }
......
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
#define DB_ACLS \ #define DB_ACLS \
(UPDATE_ACL | SELECT_ACL | INSERT_ACL | DELETE_ACL | CREATE_ACL | DROP_ACL | \ (UPDATE_ACL | SELECT_ACL | INSERT_ACL | DELETE_ACL | CREATE_ACL | DROP_ACL | \
GRANT_ACL | REFERENCES_ACL | INDEX_ACL | ALTER_ACL) GRANT_ACL | REFERENCES_ACL | INDEX_ACL | ALTER_ACL | CREATE_TMP_ACL | LOCK_TABLES_ACL)
#define TABLE_ACLS \ #define TABLE_ACLS \
(SELECT_ACL | INSERT_ACL | UPDATE_ACL | DELETE_ACL | CREATE_ACL | DROP_ACL | \ (SELECT_ACL | INSERT_ACL | UPDATE_ACL | DELETE_ACL | CREATE_ACL | DROP_ACL | \
...@@ -59,10 +59,21 @@ ...@@ -59,10 +59,21 @@
#define EXTRA_ACL (1L << 29) #define EXTRA_ACL (1L << 29)
#define NO_ACCESS (1L << 30) #define NO_ACCESS (1L << 30)
/* defines to change the above bits to how things are stored in tables */ /*
Defines to change the above bits to how things are stored in tables
This is needed as the 'host' and 'db' table is missing a few privileges
*/
/* Continius bit-segments that needs to be shifted */
#define DB_REL1 (RELOAD_ACL | SHUTDOWN_ACL | PROCESS_ACL | FILE_ACL)
#define DB_REL2 (GRANT_ACL | REFERENCES_ACL)
/* Privileges that needs to be reallocated (in continous chunks) */
#define DB_CHUNK1 (GRANT_ACL | REFERENCES_ACL | INDEX_ACL | ALTER_ACL)
#define DB_CHUNK2 (CREATE_TMP_ACL | LOCK_TABLES_ACL)
#define fix_rights_for_db(A) (((A) & 63) | (((A) & ~63) << 4)) #define fix_rights_for_db(A) (((A) & 63) | (((A) & DB_REL1) << 4) | (((A) & DB_REL2) << 6))
#define get_rights_for_db(A) (((A) & 63) | (((A) & ~63) >> 4)) #define get_rights_for_db(A) (((A) & 63) | (((A) & DB_CHUNK1) >> 4) | (((A) & DB_CHUNK2) >> 6))
#define fix_rights_for_table(A) (((A) & 63) | (((A) & ~63) << 4)) #define fix_rights_for_table(A) (((A) & 63) | (((A) & ~63) << 4))
#define get_rights_for_table(A) (((A) & 63) | (((A) & ~63) >> 4)) #define get_rights_for_table(A) (((A) & 63) | (((A) & ~63) >> 4))
#define fix_rights_for_column(A) (((A) & COL_ACLS) | ((A & ~COL_ACLS) << 7)) #define fix_rights_for_column(A) (((A) & COL_ACLS) | ((A & ~COL_ACLS) << 7))
......
...@@ -80,10 +80,6 @@ const char *command_name[]={ ...@@ -80,10 +80,6 @@ const char *command_name[]={
bool volatile abort_slave = 0; bool volatile abort_slave = 0;
#ifdef HAVE_OPENSSL
extern struct st_VioSSLAcceptorFd * ssl_acceptor_fd;
#endif /* HAVE_OPENSSL */
#ifdef __WIN__ #ifdef __WIN__
static void test_signal(int sig_ptr) static void test_signal(int sig_ptr)
{ {
...@@ -330,6 +326,38 @@ void free_max_user_conn(void) ...@@ -330,6 +326,38 @@ void free_max_user_conn(void)
} }
/*
Mark all commands that somehow changes a table
This is used to check number of updates / hour
*/
char uc_update_queries[SQLCOM_END];
void init_update_queries(void)
{
uc_update_queries[SQLCOM_CREATE_TABLE]=1;
uc_update_queries[SQLCOM_CREATE_INDEX]=1;
uc_update_queries[SQLCOM_ALTER_TABLE]=1;
uc_update_queries[SQLCOM_UPDATE]=1;
uc_update_queries[SQLCOM_INSERT]=1;
uc_update_queries[SQLCOM_INSERT_SELECT]=1;
uc_update_queries[SQLCOM_DELETE]=1;
uc_update_queries[SQLCOM_TRUNCATE]=1;
uc_update_queries[SQLCOM_DROP_TABLE]=1;
uc_update_queries[SQLCOM_LOAD]=1;
uc_update_queries[SQLCOM_CREATE_DB]=1;
uc_update_queries[SQLCOM_DROP_DB]=1;
uc_update_queries[SQLCOM_REPLACE]=1;
uc_update_queries[SQLCOM_REPLACE_SELECT]=1;
uc_update_queries[SQLCOM_RENAME_TABLE]=1;
uc_update_queries[SQLCOM_BACKUP_TABLE]=1;
uc_update_queries[SQLCOM_RESTORE_TABLE]=1;
uc_update_queries[SQLCOM_DELETE_MULTI]=1;
uc_update_queries[SQLCOM_DROP_INDEX]=1;
uc_update_queries[SQLCOM_MULTI_UPDATE]=1;
}
/* /*
Check if maximum queries per hour limit has been reached Check if maximum queries per hour limit has been reached
returns 0 if OK. returns 0 if OK.
...@@ -339,7 +367,6 @@ void free_max_user_conn(void) ...@@ -339,7 +367,6 @@ void free_max_user_conn(void)
a couple of queries, this isn't critical. a couple of queries, this isn't critical.
*/ */
char uc_update_queries[SQLCOM_END];
static bool check_mqh(THD *thd, uint check_command) static bool check_mqh(THD *thd, uint check_command)
{ {
......
...@@ -322,10 +322,10 @@ int mysqld_extend_show_tables(THD *thd,const char *db,const char *wild) ...@@ -322,10 +322,10 @@ int mysqld_extend_show_tables(THD *thd,const char *db,const char *wild)
file->info(HA_STATUS_VARIABLE | HA_STATUS_TIME | HA_STATUS_NO_LOCK); file->info(HA_STATUS_VARIABLE | HA_STATUS_TIME | HA_STATUS_NO_LOCK);
net_store_data(packet, convert, file->table_type()); net_store_data(packet, convert, file->table_type());
net_store_data(packet, convert, net_store_data(packet, convert,
(table->db_options_in_use & HA_OPTION_COMPRESS_RECORD) ?
"Compressed" :
(table->db_options_in_use & HA_OPTION_PACK_RECORD) ? (table->db_options_in_use & HA_OPTION_PACK_RECORD) ?
"Dynamic" : "Dynamic" : "Fixed");
(table->db_options_in_use & HA_OPTION_COMPRESS_RECORD)
? "Compressed" : "Fixed");
net_store_data(packet, (longlong) file->records); net_store_data(packet, (longlong) file->records);
net_store_data(packet, (uint32) file->mean_rec_length); net_store_data(packet, (uint32) file->mean_rec_length);
net_store_data(packet, (longlong) file->data_file_length); net_store_data(packet, (longlong) file->data_file_length);
......
...@@ -866,7 +866,7 @@ bool close_cached_table(THD *thd,TABLE *table) ...@@ -866,7 +866,7 @@ bool close_cached_table(THD *thd,TABLE *table)
if (table) if (table)
{ {
DBUG_PRINT("enter",("table: %s", table->table_name)); DBUG_PRINT("enter",("table: %s", table->real_name));
VOID(table->file->extra(HA_EXTRA_FORCE_REOPEN)); // Close all data files VOID(table->file->extra(HA_EXTRA_FORCE_REOPEN)); // Close all data files
/* Mark all tables that are in use as 'old' */ /* Mark all tables that are in use as 'old' */
mysql_lock_abort(thd,table); // end threads waiting on lock mysql_lock_abort(thd,table); // end threads waiting on lock
...@@ -874,7 +874,7 @@ bool close_cached_table(THD *thd,TABLE *table) ...@@ -874,7 +874,7 @@ bool close_cached_table(THD *thd,TABLE *table)
#if defined(USING_TRANSACTIONS) || defined( __WIN__) || defined( __EMX__) || !defined(OS2) #if defined(USING_TRANSACTIONS) || defined( __WIN__) || defined( __EMX__) || !defined(OS2)
/* Wait until all there are no other threads that has this table open */ /* Wait until all there are no other threads that has this table open */
while (remove_table_from_cache(thd,table->table_cache_key, while (remove_table_from_cache(thd,table->table_cache_key,
table->table_name)) table->real_name))
{ {
dropping_tables++; dropping_tables++;
(void) pthread_cond_wait(&COND_refresh,&LOCK_open); (void) pthread_cond_wait(&COND_refresh,&LOCK_open);
...@@ -882,7 +882,7 @@ bool close_cached_table(THD *thd,TABLE *table) ...@@ -882,7 +882,7 @@ bool close_cached_table(THD *thd,TABLE *table)
} }
#else #else
(void) remove_table_from_cache(thd,table->table_cache_key, (void) remove_table_from_cache(thd,table->table_cache_key,
table->table_name); table->real_name);
#endif #endif
/* When lock on LOCK_open is freed other threads can continue */ /* When lock on LOCK_open is freed other threads can continue */
pthread_cond_broadcast(&COND_refresh); pthread_cond_broadcast(&COND_refresh);
...@@ -932,7 +932,7 @@ static int prepare_for_restore(THD* thd, TABLE_LIST* table, ...@@ -932,7 +932,7 @@ static int prepare_for_restore(THD* thd, TABLE_LIST* table,
{ {
char* backup_dir = thd->lex.backup_dir; char* backup_dir = thd->lex.backup_dir;
char src_path[FN_REFLEN], dst_path[FN_REFLEN]; char src_path[FN_REFLEN], dst_path[FN_REFLEN];
char* table_name = table->name; char* table_name = table->real_name;
char* db = thd->db ? thd->db : table->db; char* db = thd->db ? thd->db : table->db;
if (fn_format_relative_to_data_home(src_path, table_name, backup_dir, if (fn_format_relative_to_data_home(src_path, table_name, backup_dir,
......
...@@ -120,7 +120,6 @@ int vio_blocking(Vio * vio __attribute__((unused)), my_bool set_blocking_mode, ...@@ -120,7 +120,6 @@ int vio_blocking(Vio * vio __attribute__((unused)), my_bool set_blocking_mode,
DBUG_PRINT("enter", ("set_blocking_mode: %d old_mode: %d", DBUG_PRINT("enter", ("set_blocking_mode: %d old_mode: %d",
(int) set_blocking_mode, (int) *old_mode)); (int) set_blocking_mode, (int) *old_mode));
#if !defined(HAVE_OPENSSL)
#if !defined(___WIN__) && !defined(__EMX__) #if !defined(___WIN__) && !defined(__EMX__)
#if !defined(NO_FCNTL_NONBLOCK) #if !defined(NO_FCNTL_NONBLOCK)
if (vio->sd >= 0) if (vio->sd >= 0)
...@@ -161,7 +160,6 @@ int vio_blocking(Vio * vio __attribute__((unused)), my_bool set_blocking_mode, ...@@ -161,7 +160,6 @@ int vio_blocking(Vio * vio __attribute__((unused)), my_bool set_blocking_mode,
r= test(!(vio->fcntl_mode & O_NONBLOCK)) != set_blocking_mode; r= test(!(vio->fcntl_mode & O_NONBLOCK)) != set_blocking_mode;
#endif /* __EMX__ */ #endif /* __EMX__ */
#endif /* !defined(__WIN__) && !defined(__EMX__) */ #endif /* !defined(__WIN__) && !defined(__EMX__) */
#endif /* !defined (HAVE_OPENSSL) */
DBUG_PRINT("exit", ("%d", r)); DBUG_PRINT("exit", ("%d", r));
DBUG_RETURN(r); DBUG_RETURN(r);
} }
......
...@@ -44,28 +44,30 @@ report_errors() ...@@ -44,28 +44,30 @@ report_errors()
unsigned long l; unsigned long l;
const char* file; const char* file;
const char* data; const char* data;
int line,flags, any_ssl_error = 0; int line,flags;
DBUG_ENTER("report_errors"); DBUG_ENTER("report_errors");
while ((l=ERR_get_error_line_data(&file,&line,&data,&flags)) != 0) while ((l=ERR_get_error_line_data(&file,&line,&data,&flags)))
{ {
char buf[200]; char buf[512];
any_ssl_error = 1;
DBUG_PRINT("error", ("OpenSSL: %s:%s:%d:%s\n", ERR_error_string(l,buf), DBUG_PRINT("error", ("OpenSSL: %s:%s:%d:%s\n", ERR_error_string(l,buf),
file,line,(flags&ERR_TXT_STRING)?data:"")) ; file,line,(flags&ERR_TXT_STRING)?data:"")) ;
} }
if (!any_ssl_error) { DBUG_PRINT("info", ("errno: %d", socket_errno));
DBUG_PRINT("info", ("No OpenSSL errors."));
}
DBUG_PRINT("info", ("BTW, errno=%d", socket_errno));
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
/*
Delete a vio object
SYNPOSIS
vio_ssl_delete()
vio Vio object. May be 0.
*/
void vio_ssl_delete(Vio * vio) void vio_ssl_delete(Vio * vio)
{ {
/* It must be safe to delete null pointers. */
/* This matches the semantics of C++'s delete operator. */
if (vio) if (vio)
{ {
if (vio->type != VIO_CLOSED) if (vio->type != VIO_CLOSED)
...@@ -74,6 +76,7 @@ void vio_ssl_delete(Vio * vio) ...@@ -74,6 +76,7 @@ void vio_ssl_delete(Vio * vio)
} }
} }
int vio_ssl_errno(Vio *vio __attribute__((unused))) int vio_ssl_errno(Vio *vio __attribute__((unused)))
{ {
return socket_errno; /* On Win32 this mapped to WSAGetLastError() */ return socket_errno; /* On Win32 this mapped to WSAGetLastError() */
...@@ -87,17 +90,12 @@ int vio_ssl_read(Vio * vio, gptr buf, int size) ...@@ -87,17 +90,12 @@ int vio_ssl_read(Vio * vio, gptr buf, int size)
DBUG_PRINT("enter", ("sd=%d, buf=%p, size=%d, ssl_=%p", DBUG_PRINT("enter", ("sd=%d, buf=%p, size=%d, ssl_=%p",
vio->sd, buf, size, vio->ssl_)); vio->sd, buf, size, vio->ssl_));
#ifndef DBUG_OFF if ((r= SSL_read(vio->ssl_, buf, size)) < 0)
errno = 0; {
#endif /* DBUG_OFF */ int err= SSL_get_error(vio->ssl_, r);
r = SSL_read(vio->ssl_, buf, size); DBUG_PRINT("error",("SSL_read(): %d SSL_get_error(): %d", r, err));
#ifndef DBUG_OFF
if ( r<= 0) {
r=SSL_get_error(vio->ssl_, r);
DBUG_PRINT("info",("SSL_get_error returned %d",r));
report_errors(); report_errors();
} }
#endif /* DBUG_OFF */
DBUG_PRINT("exit", ("%d", r)); DBUG_PRINT("exit", ("%d", r));
DBUG_RETURN(r); DBUG_RETURN(r);
} }
...@@ -109,14 +107,8 @@ int vio_ssl_write(Vio * vio, const gptr buf, int size) ...@@ -109,14 +107,8 @@ int vio_ssl_write(Vio * vio, const gptr buf, int size)
DBUG_ENTER("vio_ssl_write"); DBUG_ENTER("vio_ssl_write");
DBUG_PRINT("enter", ("sd=%d, buf=%p, size=%d", vio->sd, buf, size)); DBUG_PRINT("enter", ("sd=%d, buf=%p, size=%d", vio->sd, buf, size));
#ifndef DBUG_OFF if ((r= SSL_write(vio->ssl_, buf, size)) < 0)
errno = 0;
#endif /* DBUG_OFF */
r = SSL_write(vio->ssl_, buf, size);
#ifndef DBUG_OFF
if (r<0)
report_errors(); report_errors();
#endif /* DBUG_OFF */
DBUG_PRINT("exit", ("%d", r)); DBUG_PRINT("exit", ("%d", r));
DBUG_RETURN(r); DBUG_RETURN(r);
} }
...@@ -124,7 +116,7 @@ int vio_ssl_write(Vio * vio, const gptr buf, int size) ...@@ -124,7 +116,7 @@ int vio_ssl_write(Vio * vio, const gptr buf, int size)
int vio_ssl_fastsend(Vio * vio __attribute__((unused))) int vio_ssl_fastsend(Vio * vio __attribute__((unused)))
{ {
int r=0; int r= 0;
DBUG_ENTER("vio_ssl_fastsend"); DBUG_ENTER("vio_ssl_fastsend");
#ifdef IPTOS_THROUGHPUT #ifdef IPTOS_THROUGHPUT
...@@ -148,18 +140,17 @@ int vio_ssl_fastsend(Vio * vio __attribute__((unused))) ...@@ -148,18 +140,17 @@ int vio_ssl_fastsend(Vio * vio __attribute__((unused)))
DBUG_RETURN(r); DBUG_RETURN(r);
} }
int vio_ssl_keepalive(Vio* vio, my_bool set_keep_alive) int vio_ssl_keepalive(Vio* vio, my_bool set_keep_alive)
{ {
int r=0; int r=0;
uint opt = 0;
DBUG_ENTER("vio_ssl_keepalive"); DBUG_ENTER("vio_ssl_keepalive");
DBUG_PRINT("enter", ("sd=%d, set_keep_alive=%d", vio->sd, (int) DBUG_PRINT("enter", ("sd=%d, set_keep_alive=%d", vio->sd, (int)
set_keep_alive)); set_keep_alive));
if (vio->type != VIO_TYPE_NAMEDPIPE) if (vio->type != VIO_TYPE_NAMEDPIPE)
{ {
if (set_keep_alive) uint opt = (set_keep_alive) ? 1 : 0;
opt = 1; r= setsockopt(vio->sd, SOL_SOCKET, SO_KEEPALIVE, (char *) &opt,
r = setsockopt(vio->sd, SOL_SOCKET, SO_KEEPALIVE, (char *) &opt,
sizeof(opt)); sizeof(opt));
} }
DBUG_RETURN(r); DBUG_RETURN(r);
...@@ -186,10 +177,13 @@ int vio_ssl_close(Vio * vio) ...@@ -186,10 +177,13 @@ int vio_ssl_close(Vio * vio)
SSL_free(vio->ssl_); SSL_free(vio->ssl_);
vio->ssl_= 0; vio->ssl_= 0;
} }
if (shutdown(vio->sd,2)) if (vio->sd >= 0)
{
if (shutdown(vio->sd, 2))
r= -1; r= -1;
if (closesocket(vio->sd)) if (closesocket(vio->sd))
r= -1; r= -1;
}
if (r) if (r)
{ {
DBUG_PRINT("error", ("close() failed, error: %d",socket_errno)); DBUG_PRINT("error", ("close() failed, error: %d",socket_errno));
...@@ -254,6 +248,10 @@ void vio_ssl_in_addr(Vio *vio, struct in_addr *in) ...@@ -254,6 +248,10 @@ void vio_ssl_in_addr(Vio *vio, struct in_addr *in)
} }
/*
TODO: Add documentation and error handling
*/
void sslaccept(struct st_VioSSLAcceptorFd* ptr, Vio* vio, long timeout) void sslaccept(struct st_VioSSLAcceptorFd* ptr, Vio* vio, long timeout)
{ {
char *str; char *str;
...@@ -263,6 +261,7 @@ void sslaccept(struct st_VioSSLAcceptorFd* ptr, Vio* vio, long timeout) ...@@ -263,6 +261,7 @@ void sslaccept(struct st_VioSSLAcceptorFd* ptr, Vio* vio, long timeout)
DBUG_ENTER("sslaccept"); DBUG_ENTER("sslaccept");
DBUG_PRINT("enter", ("sd=%d ptr=%p", vio->sd,ptr)); DBUG_PRINT("enter", ("sd=%d ptr=%p", vio->sd,ptr));
vio_blocking(vio, 1, &unused); /* Must be called before reset */
vio_reset(vio,VIO_TYPE_SSL,vio->sd,0,FALSE); vio_reset(vio,VIO_TYPE_SSL,vio->sd,0,FALSE);
vio->ssl_=0; vio->ssl_=0;
vio->open_=FALSE; vio->open_=FALSE;
...@@ -274,7 +273,6 @@ void sslaccept(struct st_VioSSLAcceptorFd* ptr, Vio* vio, long timeout) ...@@ -274,7 +273,6 @@ void sslaccept(struct st_VioSSLAcceptorFd* ptr, Vio* vio, long timeout)
} }
DBUG_PRINT("info", ("ssl_=%p timeout=%ld",vio->ssl_, timeout)); DBUG_PRINT("info", ("ssl_=%p timeout=%ld",vio->ssl_, timeout));
SSL_clear(vio->ssl_); SSL_clear(vio->ssl_);
vio_blocking(vio, FALSE, &unused);
SSL_SESSION_set_timeout(SSL_get_session(vio->ssl_), timeout); SSL_SESSION_set_timeout(SSL_get_session(vio->ssl_), timeout);
SSL_set_fd(vio->ssl_,vio->sd); SSL_set_fd(vio->ssl_,vio->sd);
SSL_set_accept_state(vio->ssl_); SSL_set_accept_state(vio->ssl_);
...@@ -284,7 +282,8 @@ void sslaccept(struct st_VioSSLAcceptorFd* ptr, Vio* vio, long timeout) ...@@ -284,7 +282,8 @@ void sslaccept(struct st_VioSSLAcceptorFd* ptr, Vio* vio, long timeout)
DBUG_PRINT("info",("SSL_get_cipher_name() = '%s'" DBUG_PRINT("info",("SSL_get_cipher_name() = '%s'"
,SSL_get_cipher_name(vio->ssl_))); ,SSL_get_cipher_name(vio->ssl_)));
client_cert = SSL_get_peer_certificate (vio->ssl_); client_cert = SSL_get_peer_certificate (vio->ssl_);
if (client_cert != NULL) { if (client_cert != NULL)
{
DBUG_PRINT("info",("Client certificate:")); DBUG_PRINT("info",("Client certificate:"));
str = X509_NAME_oneline (X509_get_subject_name (client_cert), 0, 0); str = X509_NAME_oneline (X509_get_subject_name (client_cert), 0, 0);
DBUG_PRINT("info",("\t subject: %s", str)); DBUG_PRINT("info",("\t subject: %s", str));
...@@ -295,11 +294,12 @@ void sslaccept(struct st_VioSSLAcceptorFd* ptr, Vio* vio, long timeout) ...@@ -295,11 +294,12 @@ void sslaccept(struct st_VioSSLAcceptorFd* ptr, Vio* vio, long timeout)
free (str); free (str);
X509_free (client_cert); X509_free (client_cert);
} else }
else
DBUG_PRINT("info",("Client does not have certificate.")); DBUG_PRINT("info",("Client does not have certificate."));
str=SSL_get_shared_ciphers(vio->ssl_, buf, sizeof(buf)); str=SSL_get_shared_ciphers(vio->ssl_, buf, sizeof(buf));
if(str) if (str)
{ {
DBUG_PRINT("info",("SSL_get_shared_ciphers() returned '%s'",str)); DBUG_PRINT("info",("SSL_get_shared_ciphers() returned '%s'",str));
} }
...@@ -313,7 +313,7 @@ void sslaccept(struct st_VioSSLAcceptorFd* ptr, Vio* vio, long timeout) ...@@ -313,7 +313,7 @@ void sslaccept(struct st_VioSSLAcceptorFd* ptr, Vio* vio, long timeout)
} }
void sslconnect(struct st_VioSSLConnectorFd* ptr, Vio* vio, long timeout) int sslconnect(struct st_VioSSLConnectorFd* ptr, Vio* vio, long timeout)
{ {
char *str; char *str;
X509* server_cert; X509* server_cert;
...@@ -321,6 +321,7 @@ void sslconnect(struct st_VioSSLConnectorFd* ptr, Vio* vio, long timeout) ...@@ -321,6 +321,7 @@ void sslconnect(struct st_VioSSLConnectorFd* ptr, Vio* vio, long timeout)
DBUG_ENTER("sslconnect"); DBUG_ENTER("sslconnect");
DBUG_PRINT("enter", ("sd=%d ptr=%p ctx: %p", vio->sd,ptr,ptr->ssl_context_)); DBUG_PRINT("enter", ("sd=%d ptr=%p ctx: %p", vio->sd,ptr,ptr->ssl_context_));
vio_blocking(vio, 1, &unused); /* Must be called before reset */
vio_reset(vio,VIO_TYPE_SSL,vio->sd,0,FALSE); vio_reset(vio,VIO_TYPE_SSL,vio->sd,0,FALSE);
vio->ssl_=0; vio->ssl_=0;
vio->open_=FALSE; vio->open_=FALSE;
...@@ -328,11 +329,10 @@ void sslconnect(struct st_VioSSLConnectorFd* ptr, Vio* vio, long timeout) ...@@ -328,11 +329,10 @@ void sslconnect(struct st_VioSSLConnectorFd* ptr, Vio* vio, long timeout)
{ {
DBUG_PRINT("error", ("SSL_new failure")); DBUG_PRINT("error", ("SSL_new failure"));
report_errors(); report_errors();
DBUG_VOID_RETURN; DBUG_RETURN(1);
} }
DBUG_PRINT("info", ("ssl_=%p timeout=%ld",vio->ssl_, timeout)); DBUG_PRINT("info", ("ssl_=%p timeout=%ld",vio->ssl_, timeout));
SSL_clear(vio->ssl_); SSL_clear(vio->ssl_);
vio_blocking(vio, FALSE, &unused);
SSL_SESSION_set_timeout(SSL_get_session(vio->ssl_), timeout); SSL_SESSION_set_timeout(SSL_get_session(vio->ssl_), timeout);
SSL_set_fd (vio->ssl_, vio->sd); SSL_set_fd (vio->ssl_, vio->sd);
SSL_set_connect_state(vio->ssl_); SSL_set_connect_state(vio->ssl_);
...@@ -342,24 +342,27 @@ void sslconnect(struct st_VioSSLConnectorFd* ptr, Vio* vio, long timeout) ...@@ -342,24 +342,27 @@ void sslconnect(struct st_VioSSLConnectorFd* ptr, Vio* vio, long timeout)
DBUG_PRINT("info",("SSL_get_cipher_name() = '%s'" DBUG_PRINT("info",("SSL_get_cipher_name() = '%s'"
,SSL_get_cipher_name(vio->ssl_))); ,SSL_get_cipher_name(vio->ssl_)));
server_cert = SSL_get_peer_certificate (vio->ssl_); server_cert = SSL_get_peer_certificate (vio->ssl_);
if (server_cert != NULL) { if (server_cert != NULL)
{
DBUG_PRINT("info",("Server certificate:")); DBUG_PRINT("info",("Server certificate:"));
str = X509_NAME_oneline (X509_get_subject_name (server_cert), 0, 0); str = X509_NAME_oneline (X509_get_subject_name (server_cert), 0, 0);
DBUG_PRINT("info",("\t subject: %s", str)); DBUG_PRINT("info",("\t subject: %s", str));
free (str); free(str);
str = X509_NAME_oneline (X509_get_issuer_name (server_cert), 0, 0); str = X509_NAME_oneline (X509_get_issuer_name (server_cert), 0, 0);
DBUG_PRINT("info",("\t issuer: %s", str)); DBUG_PRINT("info",("\t issuer: %s", str));
free (str); free(str);
/* We could do all sorts of certificate verification stuff here before
* deallocating the certificate. */
/*
We could do all sorts of certificate verification stuff here before
deallocating the certificate.
*/
X509_free (server_cert); X509_free (server_cert);
} else }
else
DBUG_PRINT("info",("Server does not have certificate.")); DBUG_PRINT("info",("Server does not have certificate."));
#endif #endif
DBUG_VOID_RETURN; DBUG_RETURN(0);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment