Commit 13a57d19 authored by unknown's avatar unknown

Added defines for fast mutex in glibc 2.2 (should be safe)

Fixed crash in SELECT DISTINCT SUM(...)
Fix return value of mysortncmp() for innobase
Fix join_crash bug


Docs/manual.texi:
  Changelog
include/my_pthread.h:
  Added defines for fast mutex in glibc 2.2
mysql-test/t/join_crash.test:
  Changed table names to t1,t2...
mysys/my_bitmap.c:
  Use fast mutex
mysys/my_open.c:
  Use fast mutex
mysys/my_pthread.c:
  Use fast mutex
mysys/my_thr_init.c:
  Use fast mutex
mysys/my_winthread.c:
  Use fast mutex
mysys/thr_mutex.c:
  Use new mutexattr with error checking
sql/ha_innobase.cc:
  Fix return value of mysortncmp() for innobase
sql/sql_select.cc:
  Fix join_crash bug
BitKeeper/etc/logging_ok:
  Logging to logging@openlogging.org accepted
parent 734c846c
sasha@mysql.sashanet.com
monty@donna.mysql.fi
......@@ -42395,6 +42395,13 @@ not yet 100 % confident in this code.
@node News-3.23.36, News-3.23.35, News-3.23.x, News-3.23.x
@appendixsubsec Changes in release 3.23.36
@itemize @bullet
@item
Fixed that one can't use database names with @code{.}. This fixes a serious
security issue when @code{mysqld} is run as root.
@item
Fixed a core-dump bug when using very complex query involving
@code{DISTINCT} and summary functions.
@item
Added @code{SET TRANSACTION ISOLATION LEVEL ...}
@item
Added @code{SELECT ... FOR UPDATE}.
......@@ -499,11 +499,26 @@ extern int my_rw_unlock( my_rw_lock_t * );
#define pthread_attr_setstacksize(A,B) pthread_dummy(0)
#endif
/* Define mutex types */
#define MY_MUTEX_INIT_SLOW NULL
#define MY_MUTEX_INIT_FAST NULL
#define MY_MUTEX_INIT_ERRCHK NULL
#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
extern pthread_mutexattr_t my_fast_mutexattr;
#undef MY_MUTEX_INIT_FAST
#define MY_MUTEX_INIT_FAST &my_fast_mutexattr
#endif
#ifdef PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
extern pthread_mutexattr_t my_errchk_mutexattr;
#undef MY_INIT_MUTEX_ERRCHK
#define MY_INIT_MUTEX_ERRCHK &my_errchk_mutexattr
#endif
extern my_bool my_thread_global_init(void);
extern void my_thread_global_end(void);
extern my_bool my_thread_init(void);
extern void my_thread_end(void);
extern char *my_thread_name(void);
extern const char *my_thread_name(void);
extern long my_thread_id(void);
extern int pthread_no_free(void *);
extern int pthread_dummy(int);
......
# MySQL dump 8.13
#
# Host: localhost Database: timeprep
#--------------------------------------------------------
# Server version 3.23.35-log
#
# Table structure for table 'project'
# This test gave a core dump
#
DROP TABLE IF EXISTS project;
CREATE TABLE project (
DROP TABLE IF EXISTS t1,t2,t3,t4;
CREATE TABLE t1 (
project_id int(11) NOT NULL auto_increment,
project_row_lock int(11) NOT NULL default '0',
project_name varchar(80) NOT NULL default '',
......@@ -22,27 +16,18 @@ CREATE TABLE project (
UNIQUE KEY project (client_ptr,project_name)
) TYPE=MyISAM PACK_KEYS=1;
#
# Dumping data for table 'project'
#
INSERT INTO project VALUES (1,0,'Rejected Time',1,NULL,NULL,NULL,NULL);
INSERT INTO project VALUES (209,0,'MDGRAD Proposal/Investigation',97,NULL,NULL,NULL,'');
INSERT INTO project VALUES (208,0,'Font 9 Design',84,NULL,NULL,NULL,'');
INSERT INTO project VALUES (207,0,'Web Based Order Processing',95,NULL,NULL,NULL,'');
INSERT INTO project VALUES (205,0,'Mac Screen Saver',95,NULL,NULL,NULL,'');
INSERT INTO project VALUES (206,0,'Web Site',96,NULL,NULL,NULL,'');
INSERT INTO project VALUES (204,0,'Magnafire Glue',94,NULL,NULL,NULL,'');
INSERT INTO project VALUES (203,0,'Print Bid',93,NULL,NULL,NULL,'');
INSERT INTO project VALUES (202,0,'EPOC Port',92,NULL,NULL,NULL,'');
INSERT INTO project VALUES (201,0,'TravelMate',88,NULL,NULL,NULL,'');
#
# Table structure for table 'period'
#
DROP TABLE IF EXISTS period;
CREATE TABLE period (
INSERT INTO t1 VALUES (1,0,'Rejected Time',1,NULL,NULL,NULL,NULL);
INSERT INTO t1 VALUES (209,0,'MDGRAD Proposal/Investigation',97,NULL,NULL,NULL,'');
INSERT INTO t1 VALUES (208,0,'Font 9 Design',84,NULL,NULL,NULL,'');
INSERT INTO t1 VALUES (207,0,'Web Based Order Processing',95,NULL,NULL,NULL,'');
INSERT INTO t1 VALUES (205,0,'Mac Screen Saver',95,NULL,NULL,NULL,'');
INSERT INTO t1 VALUES (206,0,'Web Site',96,NULL,NULL,NULL,'');
INSERT INTO t1 VALUES (204,0,'Magnafire Glue',94,NULL,NULL,NULL,'');
INSERT INTO t1 VALUES (203,0,'Print Bid',93,NULL,NULL,NULL,'');
INSERT INTO t1 VALUES (202,0,'EPOC Port',92,NULL,NULL,NULL,'');
INSERT INTO t1 VALUES (201,0,'TravelMate',88,NULL,NULL,NULL,'');
CREATE TABLE t2 (
period_id int(11) NOT NULL auto_increment,
period_type enum('user_table','client_table','role_table','member_table','project_table') default NULL,
period_key int(11) default NULL,
......@@ -54,32 +39,23 @@ CREATE TABLE period (
KEY date_index (start_date,end_date)
) TYPE=MyISAM PACK_KEYS=1;
#
# Dumping data for table 'period'
#
INSERT INTO period VALUES (1,'user_table',98,'2000-01-01 00:00:00',NULL,NULL);
INSERT INTO period VALUES (2,'user_table',99,'2000-01-01 00:00:00',NULL,NULL);
INSERT INTO period VALUES (3,'user_table',100,'2000-01-01 00:00:00',NULL,NULL);
INSERT INTO period VALUES (49,'project_table',148,'2000-01-01 00:00:00',NULL,NULL);
INSERT INTO period VALUES (50,'client_table',68,'2000-01-01 00:00:00',NULL,NULL);
INSERT INTO period VALUES (51,'project_table',149,'2000-01-01 00:00:00',NULL,NULL);
INSERT INTO period VALUES (52,'project_table',150,'2000-01-01 00:00:00',NULL,NULL);
INSERT INTO period VALUES (53,'client_table',69,'2000-01-01 00:00:00',NULL,NULL);
INSERT INTO period VALUES (54,'project_table',151,'2000-01-01 00:00:00',NULL,NULL);
INSERT INTO period VALUES (55,'client_table',70,'2000-01-01 00:00:00',NULL,NULL);
INSERT INTO period VALUES (155,'role_table',1,'2000-01-01 00:00:00',NULL,NULL);
INSERT INTO period VALUES (156,'role_table',2,'2000-01-01 00:00:00',NULL,NULL);
INSERT INTO period VALUES (160,'member_table',1,'2000-01-01 00:00:00',NULL,1);
INSERT INTO period VALUES (161,'member_table',2,'2000-01-01 00:00:00',NULL,1);
INSERT INTO period VALUES (162,'member_table',3,'2000-01-01 00:00:00',NULL,1);
#
# Table structure for table 'budget'
#
DROP TABLE IF EXISTS budget;
CREATE TABLE budget (
INSERT INTO t2 VALUES (1,'user_table',98,'2000-01-01 00:00:00',NULL,NULL);
INSERT INTO t2 VALUES (2,'user_table',99,'2000-01-01 00:00:00',NULL,NULL);
INSERT INTO t2 VALUES (3,'user_table',100,'2000-01-01 00:00:00',NULL,NULL);
INSERT INTO t2 VALUES (49,'project_table',148,'2000-01-01 00:00:00',NULL,NULL);
INSERT INTO t2 VALUES (50,'client_table',68,'2000-01-01 00:00:00',NULL,NULL);
INSERT INTO t2 VALUES (51,'project_table',149,'2000-01-01 00:00:00',NULL,NULL);
INSERT INTO t2 VALUES (52,'project_table',150,'2000-01-01 00:00:00',NULL,NULL);
INSERT INTO t2 VALUES (53,'client_table',69,'2000-01-01 00:00:00',NULL,NULL);
INSERT INTO t2 VALUES (54,'project_table',151,'2000-01-01 00:00:00',NULL,NULL);
INSERT INTO t2 VALUES (55,'client_table',70,'2000-01-01 00:00:00',NULL,NULL);
INSERT INTO t2 VALUES (155,'role_table',1,'2000-01-01 00:00:00',NULL,NULL);
INSERT INTO t2 VALUES (156,'role_table',2,'2000-01-01 00:00:00',NULL,NULL);
INSERT INTO t2 VALUES (160,'member_table',1,'2000-01-01 00:00:00',NULL,1);
INSERT INTO t2 VALUES (161,'member_table',2,'2000-01-01 00:00:00',NULL,1);
INSERT INTO t2 VALUES (162,'member_table',3,'2000-01-01 00:00:00',NULL,1);
CREATE TABLE t3 (
budget_id int(11) NOT NULL auto_increment,
project_ptr int(11) NOT NULL default '0',
po_number varchar(20) NOT NULL default '',
......@@ -91,17 +67,7 @@ CREATE TABLE budget (
UNIQUE KEY po (project_ptr,po_number)
) TYPE=MyISAM PACK_KEYS=1;
#
# Dumping data for table 'budget'
#
#
# Table structure for table 'client'
#
DROP TABLE IF EXISTS client;
CREATE TABLE client (
CREATE TABLE t4 (
client_id int(11) NOT NULL auto_increment,
client_row_lock int(11) NOT NULL default '0',
client_name varchar(80) NOT NULL default '',
......@@ -111,45 +77,39 @@ CREATE TABLE client (
UNIQUE KEY client_name (client_name)
) TYPE=MyISAM PACK_KEYS=1;
#
# Dumping data for table 'client'
#
INSERT INTO client VALUES (1,0,'CPS',NULL,NULL);
INSERT INTO t4 VALUES (1,0,'CPS',NULL,NULL);
#
# The query that fails...
#
select distinct
project.project_id as project_id,
project.project_name as project_name,
project.client_ptr as client_ptr,
project.comments as comments,
sum( budget.amount_received ) + sum( budget.adjustment ) as total_budget
t1.project_id as project_id,
t1.project_name as project_name,
t1.client_ptr as client_ptr,
t1.comments as comments,
sum( t3.amount_received ) + sum( t3.adjustment ) as total_budget
from
project ,
period as client_period ,
period as project_period
t1 ,
t2 as client_period ,
t2 as project_period
left join
budget
t3
on
budget.project_ptr = project.project_id
and budget.date_received <= '2001-03-22 14:15:09'
t3.project_ptr = t1.project_id
and t3.date_received <= '2001-03-22 14:15:09'
left join
client
t4
on
client.client_id = project.client_ptr
t4.client_id = t1.client_ptr
where
1
and ( client_period.period_type = 'client_table'
and client_period.period_key = client.client_id
and client_period.period_key = t4.client_id
and ( client_period.start_date <= '2001-03-22 14:15:09' or isnull( client_period.start_date ))
and ( client_period.end_date > '2001-03-21 14:15:09' or isnull( client_period.end_date ))
)
and ( project_period.period_type = 'project_table'
and project_period.period_key = project.project_id
and project_period.period_key = t1.project_id
and ( project_period.start_date <= '2001-03-22 14:15:09' or isnull( project_period.start_date ))
and ( project_period.end_date > '2001-03-21 14:15:09' or isnull( project_period.end_date )) )
group by
......@@ -159,5 +119,5 @@ from
project_period.period_id
order by
client_name asc,
project_name asc
;
project_name asc;
DROP TABLE t1,t2,t3,t4;
......@@ -34,7 +34,7 @@ my_bool bitmap_init(MY_BITMAP *map, uint bitmap_size)
return 1;
dbug_assert(bitmap_size != ~(uint) 0);
#ifdef THREAD
pthread_mutex_init(&map->mutex, NULL);
pthread_mutex_init(&map->mutex, MY_MUTEX_INIT_FAST);
#endif
map->bitmap_size=bitmap_size;
return 0;
......
......@@ -107,7 +107,7 @@ File my_register_filename(File fd, const char *FileName, enum file_type
my_file_opened++;
my_file_info[fd].type = type_of_file;
#if defined(THREAD) && !defined(HAVE_PREAD)
pthread_mutex_init(&my_file_info[fd].mutex,NULL);
pthread_mutex_init(&my_file_info[fd].mutex,MY_MUTEX_INIT_FAST);
#endif
pthread_mutex_unlock(&THR_LOCK_open);
DBUG_PRINT("exit",("fd: %d",fd));
......
......@@ -316,7 +316,7 @@ int sigwait(sigset_t *setp, int *sigp)
pthread_t sigwait_thread_id;
inited=1;
sigemptyset(&pending_set);
pthread_mutex_init(&LOCK_sigwait,NULL);
pthread_mutex_init(&LOCK_sigwait,MY_MUTEX_INIT_FAST);
pthread_cond_init(&COND_sigwait,NULL);
pthread_attr_init(&thr_attr);
......
......@@ -28,13 +28,19 @@
pthread_key(struct st_my_thread_var*, THR_KEY_mysys);
#else
pthread_key(struct st_my_thread_var, THR_KEY_mysys);
#endif
#endif /* USE_TLS */
pthread_mutex_t THR_LOCK_malloc,THR_LOCK_open,THR_LOCK_keycache,
THR_LOCK_lock,THR_LOCK_isam,THR_LOCK_myisam,THR_LOCK_heap,
THR_LOCK_net, THR_LOCK_charset;
#ifndef HAVE_LOCALTIME_R
pthread_mutex_t LOCK_localtime_r;
#endif
#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
pthread_mutexattr_t my_fast_mutexattr;
#endif
#ifdef PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
pthread_mutexattr_t my_errchk_mutexattr;
#endif
/* FIXME Note. TlsAlloc does not set an auto destructor, so
the function my_thread_global_free must be called from
......@@ -47,20 +53,30 @@ my_bool my_thread_global_init(void)
fprintf(stderr,"Can't initialize threads: error %d\n",errno);
exit(1);
}
pthread_mutex_init(&THR_LOCK_malloc,NULL);
pthread_mutex_init(&THR_LOCK_open,NULL);
pthread_mutex_init(&THR_LOCK_keycache,NULL);
pthread_mutex_init(&THR_LOCK_lock,NULL);
pthread_mutex_init(&THR_LOCK_isam,NULL);
pthread_mutex_init(&THR_LOCK_myisam,NULL);
pthread_mutex_init(&THR_LOCK_heap,NULL);
pthread_mutex_init(&THR_LOCK_net,NULL);
pthread_mutex_init(&THR_LOCK_charset,NULL);
#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
pthread_mutexattr_init(&my_fast_mutexattr);
pthread_mutexattr_setkind_np(&my_fast_mutexattr,PTHREAD_MUTEX_ADAPTIVE_NP);
#endif
#ifdef PPTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
pthread_mutexattr_init(&my_errchk_mutexattr);
pthread_mutexattr_setkind_np(&my_errchk_mutexattr,
PTHREAD_MUTEX_ERRORCHECK_NP);
#endif
pthread_mutex_init(&THR_LOCK_malloc,MY_MUTEX_INIT_FAST);
pthread_mutex_init(&THR_LOCK_open,MY_MUTEX_INIT_FAST);
pthread_mutex_init(&THR_LOCK_keycache,MY_MUTEX_INIT_FAST);
pthread_mutex_init(&THR_LOCK_lock,MY_MUTEX_INIT_FAST);
pthread_mutex_init(&THR_LOCK_isam,MY_MUTEX_INIT_SLOW);
pthread_mutex_init(&THR_LOCK_myisam,MY_MUTEX_INIT_SLOW);
pthread_mutex_init(&THR_LOCK_heap,MY_MUTEX_INIT_FAST);
pthread_mutex_init(&THR_LOCK_net,MY_MUTEX_INIT_FAST);
pthread_mutex_init(&THR_LOCK_charset,MY_MUTEX_INIT_FAST);
#ifdef __WIN__
win_pthread_init();
#endif
#ifndef HAVE_LOCALTIME_R
pthread_mutex_init(&LOCK_localtime_r,NULL);
pthread_mutex_init(&LOCK_localtime_r,MY_MUTEX_INIT_SLOW);
#endif
return my_thread_init();
}
......@@ -70,6 +86,12 @@ void my_thread_global_end(void)
#if defined(USE_TLS)
(void) TlsFree(THR_KEY_mysys);
#endif
#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
pthread_mutexattr_destroy(&my_fast_mutexattr);
#endif
#ifdef PPTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
pthread_mutexattr_destroy(&my_errchk_mutexattr);
#endif
}
static long thread_id=0;
......@@ -114,7 +136,7 @@ my_bool my_thread_init(void)
tmp= &THR_KEY_mysys;
#endif
tmp->id= ++thread_id;
pthread_mutex_init(&tmp->mutex,NULL);
pthread_mutex_init(&tmp->mutex,MY_MUTEX_INIT_FAST);
pthread_cond_init(&tmp->suspend, NULL);
#if !defined(__WIN__) || defined(USE_TLS) || ! defined(SAFE_MUTEX)
pthread_mutex_unlock(&THR_LOCK_lock);
......@@ -180,14 +202,14 @@ long my_thread_id()
}
#ifdef DBUG_OFF
char *my_thread_name(void)
const char *my_thread_name(void)
{
return "no_name";
}
#else
char *my_thread_name(void)
const char *my_thread_name(void)
{
char name_buff[100];
struct st_my_thread_var *tmp=my_thread_var;
......
......@@ -39,7 +39,7 @@ struct pthread_map
void win_pthread_init(void)
{
pthread_mutex_init(&THR_LOCK_thread,NULL);
pthread_mutex_init(&THR_LOCK_thread,MY_MUTEX_INIT_FAST);
}
/*
......
......@@ -43,19 +43,8 @@ int safe_mutex_init(safe_mutex_t *mp,
const pthread_mutexattr_t *attr __attribute__((unused)))
{
bzero((char*) mp,sizeof(*mp));
#ifdef HAVE_LINUXTHREADS /* Some extra safety */
{
pthread_mutexattr_t tmp;
pthread_mutexattr_init(&tmp);
pthread_mutexattr_setkind_np(&tmp,PTHREAD_MUTEX_ERRORCHECK_NP);
pthread_mutex_init(&mp->global,&tmp);
pthread_mutex_init(&mp->mutex, &tmp);
pthread_mutexattr_destroy(&tmp);
}
#else
pthread_mutex_init(&mp->global,NULL);
pthread_mutex_init(&mp->global,MY_MUTEX_INIT_ERRCHK);
pthread_mutex_init(&mp->mutex,attr);
#endif
return 0;
}
......
......@@ -917,6 +917,7 @@ innobase_mysql_cmp(
not UNIV_SQL_NULL */
{
enum_field_types mysql_tp;
int ret;
dbug_assert(a_length != UNIV_SQL_NULL);
dbug_assert(b_length != UNIV_SQL_NULL);
......@@ -927,8 +928,15 @@ innobase_mysql_cmp(
case FIELD_TYPE_STRING:
case FIELD_TYPE_VAR_STRING:
return(my_sortncmp((const char*) a, a_length,
(const char*) b, b_length));
ret = my_sortncmp((const char*) a, a_length,
(const char*) b, b_length);
if (ret < 0) {
return(-1);
} else if (ret > 0) {
return(1);
} else {
return(0);
}
default:
assert(0);
}
......
......@@ -712,7 +712,7 @@ mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &fields,COND *conds,
}
if (tmp_table->distinct)
select_distinct=0; /* Each row is uniq */
select_distinct=0; /* Each row is unique */
join_free(&join); /* Free quick selects */
if (select_distinct && ! group)
......@@ -3635,7 +3635,8 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
in the first 'hidden_null_pack_length' bytes of the row.
*/
null_pack_length-=hidden_null_pack_length;
keyinfo->key_parts=field_count+ test(null_pack_length);
keyinfo->key_parts= ((field_count-hidden_field_count)+
test(null_pack_length));
if (allow_distinct_limit)
{
set_if_smaller(table->max_rows,thd->select_limit);
......@@ -3673,6 +3674,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
key_part_info->type= HA_KEYTYPE_BINARY;
key_part_info++;
}
/* Create a distinct key over the columns we are going to return */
for (i=param->hidden_field_count, reg_field=table->field + i ;
i < field_count;
i++, reg_field++, key_part_info++)
......
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