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