Merge sanja.is.com.ua:/home/bell/mysql/bk/mysql-4.1

into sanja.is.com.ua:/home/bell/mysql/bk/work-select_list-4.1
This commit is contained in:
bell@sanja.is.com.ua 2004-03-20 13:37:30 +02:00
commit b7efa3e5f6
38 changed files with 581 additions and 164 deletions

View file

@ -7,25 +7,25 @@
CFG=mysqlclient - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE
!MESSAGE NMAKE /f "mysqlclient.mak".
!MESSAGE
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE
!MESSAGE NMAKE /f "mysqlclient.mak" CFG="mysqlclient - Win32 Debug"
!MESSAGE
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE
!MESSAGE "mysqlclient - Win32 Release" (based on "Win32 (x86) Static Library")
!MESSAGE "mysqlclient - Win32 Debug" (based on "Win32 (x86) Static Library")
!MESSAGE
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=xicl6.exe
CPP=cl.exe
RSC=rc.exe
!IF "$(CFG)" == "mysqlclient - Win32 Release"
@ -48,7 +48,7 @@ RSC=rc.exe
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=xilink6.exe -lib
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo /out:"..\lib_release\mysqlclient.lib"
@ -72,11 +72,11 @@ LIB32=xilink6.exe -lib
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=xilink6.exe -lib
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo /out:"..\lib_debug\mysqlclient.lib"
!ENDIF
!ENDIF
# Begin Target
@ -252,7 +252,7 @@ SOURCE=..\mysys\mf_iocache2.c
# ADD CPP /Od
!ENDIF
!ENDIF
# End Source File
# Begin Source File
@ -310,6 +310,10 @@ SOURCE=..\mysys\my_error.c
# End Source File
# Begin Source File
SOURCE=..\mysys\my_file.c
# End Source File
# Begin Source File
SOURCE=..\mysys\my_fopen.c
# End Source File
# Begin Source File
@ -358,10 +362,6 @@ SOURCE=..\mysys\my_open.c
# End Source File
# Begin Source File
SOURCE=..\mysys\my_file.c
# End Source File
# Begin Source File
SOURCE=..\mysys\my_pread.c
# End Source File
# Begin Source File
@ -490,6 +490,10 @@ SOURCE=..\strings\strnmov.c
# End Source File
# Begin Source File
SOURCE=..\strings\strtod.c
# End Source File
# Begin Source File
SOURCE=..\strings\strtoll.c
# End Source File
# Begin Source File

View file

@ -1,94 +0,0 @@
LIBRARY LIBMYSQL
DESCRIPTION 'MySQL 3.23 Client Library'
VERSION 2.5
EXPORTS
mysql_affected_rows
mysql_close
mysql_connect
mysql_create_db
mysql_data_seek
mysql_debug
mysql_drop_db
mysql_dump_debug_info
mysql_eof
mysql_errno
mysql_error
mysql_escape_string
mysql_fetch_field
mysql_fetch_field_direct
mysql_fetch_fields
mysql_fetch_lengths
mysql_fetch_row
mysql_field_count
mysql_field_seek
mysql_field_tell
mysql_free_result
mysql_get_client_info
mysql_get_host_info
mysql_get_proto_info
mysql_get_server_info
mysql_info
mysql_init
mysql_insert_id
mysql_kill
mysql_list_dbs
mysql_list_fields
mysql_list_processes
mysql_list_tables
mysql_num_fields
mysql_num_rows
mysql_odbc_escape_string
mysql_options
mysql_ping
mysql_query
mysql_real_connect
mysql_real_query
mysql_refresh
mysql_row_seek
mysql_row_tell
mysql_select_db
mysql_shutdown
mysql_stat
mysql_store_result
mysql_thread_id
mysql_use_result
bmove_upp
delete_dynamic
_dig_vec
init_dynamic_array
insert_dynamic
int2str
is_prefix
list_add
list_delete
max_allowed_packet
my_casecmp
my_init
my_end
my_strdup
my_malloc
my_memdup
my_no_flags_free
my_realloc
my_thread_end
my_thread_init
net_buffer_length
set_dynamic
strcend
strdup_root
strfill
strinstr
strmake
strmov
strxmov
myodbc_remove_escape
mysql_thread_safe
mysql_character_set_name
mysql_change_user
mysql_send_query
mysql_read_query_result
mysql_real_escape_string
load_defaults
free_defaults

View file

@ -38,6 +38,9 @@ Package=<5>
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name mysys
End Project Dependency
}}}
###############################################################################

View file

@ -652,7 +652,7 @@ static int dump_remote_log_entries(const char* logname)
{
char buf[128];
char last_db[FN_REFLEN+1] = "";
uint len;
uint len, logname_len;
NET* net = &mysql->net;
int old_format;
DBUG_ENTER("dump_remote_log_entries");
@ -669,16 +669,16 @@ static int dump_remote_log_entries(const char* logname)
}
int4store(buf, position);
int2store(buf + BIN_LOG_HEADER_SIZE, binlog_flags);
len = (uint) strlen(logname);
logname_len = (uint) strlen(logname);
int4store(buf + 6, 0);
memcpy(buf + 10, logname,len);
if (simple_command(mysql, COM_BINLOG_DUMP, buf, len + 10, 1))
memcpy(buf + 10, logname, logname_len);
if (simple_command(mysql, COM_BINLOG_DUMP, buf, logname_len + 10, 1))
{
fprintf(stderr,"Got fatal error sending the log dump command\n");
DBUG_RETURN(1);
}
my_off_t old_off= 0;
my_off_t old_off= position;
ulonglong rec_count= 0;
char fname[FN_REFLEN+1];
@ -707,6 +707,37 @@ static int dump_remote_log_entries(const char* logname)
Log_event_type type= ev->get_type_code();
if (!old_format || ( type != LOAD_EVENT && type != CREATE_FILE_EVENT))
{
/*
If this is a Rotate event, maybe it's the end of the requested binlog;
in this case we are done (stop transfer).
This is suitable for binlogs, not relay logs (but for now we don't read
relay logs remotely because the server is not able to do that). If one
day we read relay logs remotely, then we will have a problem with the
detection below: relay logs contain Rotate events which are about the
binlogs, so which would trigger the end-detection below.
*/
if (ev->get_type_code() == ROTATE_EVENT)
{
Rotate_log_event *rev= (Rotate_log_event *)ev;
/*
If this is a fake Rotate event, and not about our log, we can stop
transfer. If this a real Rotate event (so it's not about our log,
it's in our log describing the next log), we print it (because it's
part of our log) and then we will stop when we receive the fake one
soon.
*/
if (rev->when == 0)
{
if ((rev->ident_len != logname_len) ||
memcmp(rev->new_log_ident, logname, logname_len))
DBUG_RETURN(0);
/*
Otherwise, this is a fake Rotate for our log, at the very beginning
for sure. Skip it.
*/
continue;
}
}
if (process_event(&rec_count,last_db,ev,old_off,old_format))
DBUG_RETURN(1);
}
@ -735,12 +766,10 @@ static int dump_remote_log_entries(const char* logname)
/*
Let's adjust offset for remote log as for local log to produce
similar text..
similar text. As we don't print the fake Rotate event, all events are
real so we can simply add the length.
*/
if (old_off)
old_off+= len-1;
else
old_off= BIN_LOG_HEADER_SIZE;
old_off+= len-1;
}
DBUG_RETURN(0);
}

View file

@ -2704,7 +2704,9 @@ then
/* ) rel_srcdir="$srcdir" ;;
* ) rel_srcdir="../../$srcdir" ;;
esac
AC_CONFIG_SUBDIRS($bdb/dist/configure)
(cd $bdb/build_unix && \
sh $rel_srcdir/$bdb/dist/configure $bdb_conf_flags) || \
AC_MSG_ERROR([could not configure Berkeley DB])
dnl echo "bdb = '$bdb'; inc = '$bdb_includes', lib = '$bdb_libs'"
echo "END OF BERKELEY DB CONFIGURATION"

View file

@ -21,6 +21,10 @@
#include "heapdef.h"
static void heap_extra_keyflag(register HP_INFO *info,
enum ha_extra_function function);
/* set extra flags for database */
int heap_extra(register HP_INFO *info, enum ha_extra_function function)
@ -41,8 +45,37 @@ int heap_extra(register HP_INFO *info, enum ha_extra_function function)
case HA_EXTRA_READCHECK:
info->opt_flag|= READ_CHECK_USED;
break;
case HA_EXTRA_CHANGE_KEY_TO_UNIQUE:
case HA_EXTRA_CHANGE_KEY_TO_DUP:
heap_extra_keyflag(info, function);
break;
default:
break;
}
DBUG_RETURN(0);
} /* heap_extra */
/*
Start/Stop Inserting Duplicates Into a Table, WL#1648.
*/
static void heap_extra_keyflag(register HP_INFO *info,
enum ha_extra_function function)
{
uint idx;
for (idx= 0; idx< info->s->keys; idx++)
{
switch (function) {
case HA_EXTRA_CHANGE_KEY_TO_UNIQUE:
info->s->keydef[idx].flag|= HA_NOSAME;
break;
case HA_EXTRA_CHANGE_KEY_TO_DUP:
info->s->keydef[idx].flag&= ~(HA_NOSAME);
break;
default:
break;
}
}
}

View file

@ -210,7 +210,8 @@ typedef struct charset_info_st
uint strxfrm_multiply;
uint mbminlen;
uint mbmaxlen;
char max_sort_char; /* For LIKE optimization */
uint16 min_sort_char;
uint16 max_sort_char; /* For LIKE optimization */
MY_CHARSET_HANDLER *cset;
MY_COLLATION_HANDLER *coll;
@ -305,6 +306,13 @@ my_bool my_like_range_simple(CHARSET_INFO *cs,
char *min_str, char *max_str,
uint *min_length, uint *max_length);
my_bool my_like_range_ucs2(CHARSET_INFO *cs,
const char *ptr, uint ptr_length,
pbool escape, pbool w_one, pbool w_many,
uint res_length,
char *min_str, char *max_str,
uint *min_length, uint *max_length);
int my_wildcmp_8bit(CHARSET_INFO *,
const char *str,const char *str_end,

View file

@ -141,7 +141,12 @@ enum ha_extra_function {
HA_EXTRA_RETRIEVE_PRIMARY_KEY,
HA_EXTRA_PREPARE_FOR_DELETE,
HA_EXTRA_PREPARE_FOR_UPDATE, /* Remove read cache if problems */
HA_EXTRA_PRELOAD_BUFFER_SIZE /* Set buffer size for preloading */
HA_EXTRA_PRELOAD_BUFFER_SIZE, /* Set buffer size for preloading */
/*
On-the-fly switching between unique and non-unique key inserting.
*/
HA_EXTRA_CHANGE_KEY_TO_UNIQUE,
HA_EXTRA_CHANGE_KEY_TO_DUP
};
/* The following is parameter to ha_panic() */

View file

@ -19,6 +19,9 @@
#include <sys/mman.h>
#endif
static void mi_extra_keyflag(MI_INFO *info, enum ha_extra_function function);
/*
Set options and buffers to optimize table handling
@ -355,6 +358,10 @@ int mi_extra(MI_INFO *info, enum ha_extra_function function, void *extra_arg)
case HA_EXTRA_PRELOAD_BUFFER_SIZE:
info->preload_buff_size= *((ulong *) extra_arg);
break;
case HA_EXTRA_CHANGE_KEY_TO_UNIQUE:
case HA_EXTRA_CHANGE_KEY_TO_DUP:
mi_extra_keyflag(info, function);
break;
case HA_EXTRA_KEY_CACHE:
case HA_EXTRA_NO_KEY_CACHE:
default:
@ -367,3 +374,27 @@ int mi_extra(MI_INFO *info, enum ha_extra_function function, void *extra_arg)
}
DBUG_RETURN(error);
} /* mi_extra */
/*
Start/Stop Inserting Duplicates Into a Table, WL#1648.
*/
static void mi_extra_keyflag(MI_INFO *info, enum ha_extra_function function)
{
uint idx;
for (idx= 0; idx< info->s->base.keys; idx++)
{
switch (function) {
case HA_EXTRA_CHANGE_KEY_TO_UNIQUE:
info->s->keyinfo[idx].flag|= HA_NOSAME;
break;
case HA_EXTRA_CHANGE_KEY_TO_DUP:
info->s->keyinfo[idx].flag&= ~(HA_NOSAME);
break;
default:
break;
}
}
}

View file

@ -343,6 +343,22 @@ t1 CREATE TABLE `t1` (
`a` char(10) character set latin1 default NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251
drop table t1;
create table t1 (myblob longblob,mytext longtext)
default charset latin1 collate latin1_general_cs;
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`myblob` longblob,
`mytext` longtext character set latin1 collate latin1_general_cs
) ENGINE=MyISAM DEFAULT CHARSET=latin1
alter table t1 character set latin2;
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`myblob` longblob,
`mytext` longtext character set latin2
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
CREATE TABLE t1 (
Host varchar(16) binary NOT NULL default '',
User varchar(16) binary NOT NULL default '',

View file

@ -21,7 +21,7 @@ select * from mysqltest.mysqltest;
n
4
drop database if exists mysqltest;
affected rows: 4
affected rows: 1
create database mysqltest;
drop database mysqltest;
flush tables with read lock;

View file

@ -339,6 +339,8 @@ select concat(_latin1'a',_latin2'a',_latin5'a');
ERROR HY000: Illegal mix of collations (latin1_swedish_ci,COERCIBLE), (latin2_general_ci,COERCIBLE), (latin5_turkish_ci,COERCIBLE) for operation 'concat'
select concat(_latin1'a',_latin2'a',_latin5'a',_latin7'a');
ERROR HY000: Illegal mix of collations for operation 'concat'
select concat_ws(_latin1'a',_latin2'a');
ERROR HY000: Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (latin2_general_ci,COERCIBLE) for operation 'concat_ws'
select FIELD('b','A','B');
FIELD('b','A','B')
2

View file

@ -64,9 +64,6 @@ LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-2-1' INTO TABLE `t1` FI
LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-3-1' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word);
LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-4-1' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word);
LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-5-1' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word);
LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-6-1' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word);
SET TIMESTAMP=1000000000;
insert into t1 values ("Alas");
--- Broken LOAD DATA --
/*!40019 SET @@session.max_insert_delayed_threads=0*/;

View file

@ -183,6 +183,17 @@ show create table t1;
drop table t1;
#
# Bug#2821
# Test that table CHARACTER SET does not affect blobs
#
create table t1 (myblob longblob,mytext longtext)
default charset latin1 collate latin1_general_cs;
show create table t1;
alter table t1 character set latin2;
show create table t1;
drop table t1;
#
# Test ALTER TABLE ENABLE/DISABLE keys when things are locked
#

View file

@ -195,6 +195,8 @@ select concat(_latin1'a',_latin2'a');
select concat(_latin1'a',_latin2'a',_latin5'a');
--error 1271
select concat(_latin1'a',_latin2'a',_latin5'a',_latin7'a');
--error 1267
select concat_ws(_latin1'a',_latin2'a');
#
# Test FIELD() and collations

View file

@ -70,7 +70,6 @@ select "--- Remote --" as "";
--enable_query_log
# This is broken now
# By the way it seems that remote version fetches all events with name >= master-bin.000001
--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR
--exec $MYSQL_BINLOG --short-form --local-load=$MYSQL_TEST_DIR/var/tmp/ --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000001

View file

@ -62,7 +62,7 @@ static void set_max_sort_char(CHARSET_INFO *cs)
if ((uchar) cs->sort_order[i] > max_char)
{
max_char=(uchar) cs->sort_order[i];
cs->max_sort_char= (char) i;
cs->max_sort_char= i;
}
}
}

258
mysys/uca-dump.c Normal file
View file

@ -0,0 +1,258 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef unsigned char uchar;
typedef unsigned short uint16;
struct uca_item_st
{
uchar num;
uint16 weight[4][8];
};
#if 1
#define MY_UCA_NPAGES 1024
#define MY_UCA_NCHARS 64
#define MY_UCA_CMASK 63
#define MY_UCA_PSHIFT 6
#else
#define MY_UCA_NPAGES 256
#define MY_UCA_NCHARS 256
#define MY_UCA_CMASK 255
#define MY_UCA_PSHIFT 8
#endif
int main(int ac, char **av)
{
char str[256];
char *weights[64];
struct uca_item_st uca[64*1024];
size_t code, page, w;
int pagemaxlen[MY_UCA_NPAGES];
bzero(uca, sizeof(uca));
while (fgets(str,sizeof(str),stdin))
{
char *comment;
char *weight;
char *s;
size_t codenum;
code= strtol(str,NULL,16);
if (str[0]=='#' || (code > 0xFFFF))
continue;
if ((comment=strchr(str,'#')))
{
*comment++= '\0';
for ( ; *comment==' ' ; comment++);
}else
continue;
if ((weight=strchr(str,';')))
{
*weight++= '\0';
for ( ; *weight==' ' ; weight++);
}
else
continue;
codenum= 0;
s= strtok(str, " \t");
while (s)
{
s= strtok(NULL, " \t");
codenum++;
}
if (codenum>1)
{
/* Multi-character weight */
continue;
}
uca[code].num= 0;
s= strtok(weight, " []");
while (s)
{
weights[uca[code].num]= s;
s= strtok(NULL, " []");
uca[code].num++;
}
for (w=0; w < uca[code].num; w++)
{
size_t partnum;
partnum= 0;
s= weights[w];
while (*s)
{
char *endptr;
size_t part;
part= strtol(s+1,&endptr,16);
uca[code].weight[partnum][w]= part;
s= endptr;
partnum++;
}
}
}
/* Now set implicit weights */
for (code=0; code <= 0xFFFF; code++)
{
size_t base, aaaa, bbbb;
if (uca[code].num)
continue;
/*
3400;<CJK Ideograph Extension A, First>
4DB5;<CJK Ideograph Extension A, Last>
4E00;<CJK Ideograph, First>
9FA5;<CJK Ideograph, Last>
*/
if (code >= 0x3400 && code <= 0x4DB5)
base= 0xFB80;
else if (code >= 0x4E00 && code <= 0x9FA5)
base= 0xFB40;
else
base= 0xFBC0;
aaaa= base + (code >> 15);
bbbb= (code & 0x7FFF) | 0x8000;
uca[code].weight[0][0]= aaaa;
uca[code].weight[0][1]= bbbb;
uca[code].weight[1][0]= 0x0020;
uca[code].weight[1][1]= 0x0000;
uca[code].weight[2][0]= 0x0002;
uca[code].weight[2][1]= 0x0000;
uca[code].weight[3][0]= 0x0001;
uca[code].weight[3][2]= 0x0000;
uca[code].num= 2;
}
printf("#include \"my_uca.h\"\n");
printf("#define MY_UCA_NPAGES %d\n",MY_UCA_NPAGES);
printf("#define MY_UCA_NCHARS %d\n",MY_UCA_NCHARS);
printf("#define MY_UCA_CMASK %d\n",MY_UCA_CMASK);
printf("#define MY_UCA_PSHIFT %d\n",MY_UCA_PSHIFT);
for (w=0; w<1; w++)
{
for (page=0; page < MY_UCA_NPAGES; page++)
{
size_t offs;
size_t maxnum= 0;
size_t nchars= 0;
size_t mchars;
/*
Calculate maximum weight
length for this page
*/
for (offs=0; offs < MY_UCA_NCHARS; offs++)
{
size_t i, num;
code= page*MY_UCA_NCHARS+offs;
/* Calculate only non-zero weights */
num=0;
for (i=0; i < uca[code].num; i++)
if (uca[code].weight[w][i])
num++;
maxnum= maxnum < num ? num : maxnum;
}
if (!maxnum)
maxnum=1;
switch (maxnum)
{
case 0: mchars= 8; break;
case 1: mchars= 8; break;
case 2: mchars= 8; break;
case 3: mchars= 9; break;
case 4: mchars= 8; break;
default: mchars= uca[code].num;
}
pagemaxlen[page]= maxnum;
printf("uint16 page%03Xdata[]= { /* %04X (%d weights per char) */\n",
page, page*MY_UCA_NCHARS, maxnum);
/*
Now print this page
*/
for (offs=0; offs < MY_UCA_NCHARS; offs++)
{
uint16 weight[8];
size_t num, i;
code= page*MY_UCA_NCHARS+offs;
bzero(weight,sizeof(weight));
/* Copy non-zero weights */
for (num=0, i=0; i < uca[code].num; i++)
{
if (uca[code].weight[w][i])
{
weight[num]= uca[code].weight[w][i];
num++;
}
}
for (i=0; i < maxnum; i++)
{
printf("0x%04X",(int)weight[i]);
if ((offs+1 != MY_UCA_NCHARS) || (i+1!=maxnum))
printf(",");
nchars++;
}
if (nchars >=mchars)
{
printf("\n");
nchars=0;
}
else
{
printf(" ");
}
}
printf("};\n\n");
}
}
printf("uchar ucal[%d]={\n",MY_UCA_NPAGES);
for (page=0; page < MY_UCA_NPAGES; page++)
{
printf("%d%s%s",pagemaxlen[page],page<MY_UCA_NPAGES-1?",":"",(page+1) % 16 ? "":"\n");
}
printf("};\n");
printf("uint16 *ucaw[%d]={\n",MY_UCA_NPAGES);
for (page=0; page < MY_UCA_NPAGES; page++)
{
printf("page%03Xdata%s%s",page,page<MY_UCA_NPAGES-1?",":"", (page+1) % 4 ? "":"\n");
}
printf("};\n");
printf("int main(void){ return 0;};\n");
return 0;
}

View file

@ -1545,11 +1545,11 @@ udf_handler::fix_fields(THD *thd, TABLE_LIST *tables, Item_result_field *func,
arg++,i++)
{
if ((*arg)->fix_fields(thd, tables, arg))
return 1;
DBUG_RETURN(1);
// we can't assign 'item' before, because fix_fields() can change arg
Item *item= *arg;
if (item->check_cols(1))
return 1;
DBUG_RETURN(1);
/*
TODO: We should think about this. It is not always
right way just to set an UDF result to return my_charset_bin

View file

@ -641,9 +641,11 @@ void Item_func_concat_ws::fix_length_and_dec()
max_length=separator->max_length*(arg_count-1);
for (uint i=0 ; i < arg_count ; i++)
{
DTCollation tmp(collation.collation, collation.derivation);
max_length+=args[i]->max_length;
if (collation.aggregate(args[i]->collation))
{
collation.set(tmp); // Restore the previous value
my_coll_agg_error(collation, args[i]->collation, func_name());
break;
}

View file

@ -502,8 +502,6 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db,
{
if (find_type(extension, &known_extentions,1+2) <= 0)
found_other_files++;
else
deleted++;
continue;
}
if (db && !my_strcasecmp(&my_charset_latin1,
@ -530,7 +528,6 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db,
{
goto err;
}
deleted++;
}
}
if (thd->killed ||

View file

@ -470,9 +470,11 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name,
sql_field->charset= create_info->default_table_charset;
/*
table_charset is set in ALTER TABLE if we want change character set
for all varchar/char columns
for all varchar/char columns.
But the table charset must not affect the BLOB fields, so don't
allow to change my_charset_bin to somethig else.
*/
if (create_info->table_charset)
if (create_info->table_charset && sql_field->charset != &my_charset_bin)
sql_field->charset= create_info->table_charset;
sql_field->create_length_to_internal_length();

View file

@ -298,7 +298,11 @@ udf_func *find_udf(const char *name,uint length,bool mark_used)
DBUG_ENTER("find_udf");
/* TODO: This should be changed to reader locks someday! */
rw_rdlock(&THR_LOCK_udf);
if (mark_used)
rw_wrlock(&THR_LOCK_udf); /* Called during fix_fields */
else
rw_rdlock(&THR_LOCK_udf); /* Called during parsing */
if ((udf=(udf_func*) hash_search(&udf_hash,(byte*) name,
length ? length : (uint) strlen(name))))
{
@ -474,7 +478,7 @@ int mysql_drop_function(THD *thd,const LEX_STRING *udf_name)
if (!(udf=(udf_func*) hash_search(&udf_hash,(byte*) udf_name->str,
(uint) udf_name->length)))
{
net_printf(thd, ER_FUNCTION_NOT_DEFINED, udf_name);
net_printf(thd, ER_FUNCTION_NOT_DEFINED, udf_name->str);
goto err;
}
del_udf(udf);

View file

@ -6284,7 +6284,8 @@ CHARSET_INFO my_charset_big5_chinese_ci=
1, /* strxfrm_multiply */
1, /* mbminlen */
2, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_big5_handler,
&my_collation_big5_chinese_ci_handler
};
@ -6308,7 +6309,8 @@ CHARSET_INFO my_charset_big5_bin=
1, /* strxfrm_multiply */
1, /* mbminlen */
2, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_big5_handler,
&my_collation_mb_bin_handler
};

View file

@ -388,7 +388,8 @@ CHARSET_INFO my_charset_bin =
1, /* strxfrm_multiply */
1, /* mbminlen */
1, /* mbmaxlen */
(char) 255, /* max_sort_char */
0, /* min_sort_char */
255, /* max_sort_char */
&my_charset_handler,
&my_collation_8bit_bin_handler
};

View file

@ -634,7 +634,8 @@ CHARSET_INFO my_charset_latin2_czech_ci =
4, /* strxfrm_multiply */
1, /* mbminlen */
1, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_8bit_handler,
&my_collation_latin2_czech_ci_handler
};

View file

@ -8692,7 +8692,8 @@ CHARSET_INFO my_charset_euckr_korean_ci=
1, /* strxfrm_multiply */
1, /* mbminlen */
2, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_ci_handler
};
@ -8716,7 +8717,8 @@ CHARSET_INFO my_charset_euckr_bin=
1, /* strxfrm_multiply */
1, /* mbminlen */
2, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_mb_bin_handler
};

View file

@ -35,6 +35,7 @@ CHARSET_INFO compiled_charsets[] = {
0,
0,
0,
0,
NULL,
NULL
}

View file

@ -5743,7 +5743,8 @@ CHARSET_INFO my_charset_gb2312_chinese_ci=
1, /* strxfrm_multiply */
1, /* mbminlen */
2, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_ci_handler
};
@ -5766,7 +5767,8 @@ CHARSET_INFO my_charset_gb2312_bin=
1, /* strxfrm_multiply */
1, /* mbminlen */
2, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_mb_bin_handler
};

View file

@ -9939,7 +9939,8 @@ CHARSET_INFO my_charset_gbk_chinese_ci=
1, /* strxfrm_multiply */
1, /* mbminlen */
2, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_ci_handler
};
@ -9962,7 +9963,8 @@ CHARSET_INFO my_charset_gbk_bin=
1, /* strxfrm_multiply */
1, /* mbminlen */
2, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_mb_bin_handler
};

View file

@ -218,7 +218,8 @@ CHARSET_INFO my_charset_latin1=
1, /* strxfrm_multiply */
1, /* mbminlen */
1, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_8bit_simple_ci_handler
};
@ -414,7 +415,8 @@ CHARSET_INFO my_charset_latin1_german2_ci=
2, /* strxfrm_multiply */
1, /* mbminlen */
1, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_german2_ci_handler
};
@ -438,7 +440,8 @@ CHARSET_INFO my_charset_latin1_bin=
1, /* strxfrm_multiply */
1, /* mbminlen */
1, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_8bit_bin_handler
};

View file

@ -946,7 +946,7 @@ my_bool my_like_range_simple(CHARSET_INFO *cs,
if (*ptr == w_one) /* '_' in SQL */
{
*min_str++='\0'; /* This should be min char */
*max_str++=cs->max_sort_char;
*max_str++= (char) cs->max_sort_char;
continue;
}
if (*ptr == w_many) /* '%' in SQL */
@ -955,7 +955,7 @@ my_bool my_like_range_simple(CHARSET_INFO *cs,
*max_length=res_length;
do {
*min_str++ = ' '; /* Because if key compression */
*max_str++ = cs->max_sort_char;
*max_str++ = (char) cs->max_sort_char;
} while (min_str != min_end);
return 0;
}

View file

@ -4528,7 +4528,8 @@ CHARSET_INFO my_charset_sjis_japanese_ci=
1, /* strxfrm_multiply */
1, /* mbminlen */
2, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_ci_handler
};
@ -4551,7 +4552,8 @@ CHARSET_INFO my_charset_sjis_bin=
1, /* strxfrm_multiply */
1, /* mbminlen */
2, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_mb_bin_handler
};

View file

@ -913,7 +913,8 @@ CHARSET_INFO my_charset_tis620_thai_ci=
4, /* strxfrm_multiply */
1, /* mbminlen */
1, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_ci_handler
};
@ -936,7 +937,8 @@ CHARSET_INFO my_charset_tis620_bin=
1, /* strxfrm_multiply */
1, /* mbminlen */
1, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_8bit_bin_handler
};

View file

@ -1284,13 +1284,94 @@ void my_hash_sort_ucs2_bin(CHARSET_INFO *cs __attribute__((unused)),
}
}
/*
** Calculate min_str and max_str that ranges a LIKE string.
** Arguments:
** ptr Pointer to LIKE string.
** ptr_length Length of LIKE string.
** escape Escape character in LIKE. (Normally '\').
** All escape characters should be removed from min_str and max_str
** res_length Length of min_str and max_str.
** min_str Smallest case sensitive string that ranges LIKE.
** Should be space padded to res_length.
** max_str Largest case sensitive string that ranges LIKE.
** Normally padded with the biggest character sort value.
**
** The function should return 0 if ok and 1 if the LIKE string can't be
** optimized !
*/
my_bool my_like_range_ucs2(CHARSET_INFO *cs,
const char *ptr,uint ptr_length,
pbool escape, pbool w_one, pbool w_many,
uint res_length,
char *min_str,char *max_str,
uint *min_length,uint *max_length)
{
const char *end=ptr+ptr_length;
char *min_org=min_str;
char *min_end=min_str+res_length;
for (; ptr + 1 < end && min_str + 1 < min_end ; ptr+=2)
{
if (ptr[0] == '\0' && ptr[1] == escape && ptr+2 < end)
{
ptr+=2; /* Skip escape */
*min_str++= *max_str++ = ptr[0];
*min_str++= *max_str++ = ptr[1];
continue;
}
if (ptr[0] == '\0' && ptr[1] == w_one) /* '_' in SQL */
{
*min_str++= (char) cs->min_sort_char >> 8;
*min_str++= (char) cs->min_sort_char & 255;
*max_str++= (char) cs->max_sort_char >> 8;
*max_str++= (char) cs->max_sort_char & 255;
continue;
}
if (ptr[0] == '\0' && ptr[1] == w_many) /* '%' in SQL */
{
*min_length= (uint) (min_str - min_org);
*max_length=res_length;
do {
*min_str++ = '\0';
*min_str++ = ' '; /* Because if key compression */
*max_str++ = (char) cs->max_sort_char >>8;
*max_str++ = (char) cs->max_sort_char & 255;
} while (min_str + 1 < min_end);
return 0;
}
*min_str++= *max_str++ = ptr[0];
*min_str++= *max_str++ = ptr[1];
}
*min_length= *max_length = (uint) (min_str - min_org);
/* Temporary fix for handling w_one at end of string (key compression) */
{
char *tmp;
for (tmp= min_str ; tmp-1 > min_org && tmp[-1] == '\0' && tmp[-2]=='\0';)
{
*--tmp=' ';
*--tmp='\0';
}
}
while (min_str + 1 < min_end)
{
*min_str++ = *max_str++ = '\0';
*min_str++ = *max_str++ = ' '; /* Because if key compression */
}
return 0;
}
extern MY_COLLATION_HANDLER my_collation_uca_handler;
static MY_COLLATION_HANDLER my_collation_ucs2_general_ci_handler =
{
my_strnncoll_ucs2,
my_strnncoll_ucs2,
my_strnxfrm_ucs2,
my_like_range_simple,
my_like_range_ucs2,
my_wildcmp_ucs2_ci,
my_strcasecmp_ucs2,
my_instr_mb,
@ -1356,7 +1437,8 @@ CHARSET_INFO my_charset_ucs2_general_ci=
1, /* strxfrm_multiply */
2, /* mbminlen */
2, /* mbmaxlen */
0,
0, /* min_sort_char */
0xFFFF, /* max_sort_char */
&my_charset_ucs2_handler,
&my_collation_ucs2_general_ci_handler
};
@ -1380,7 +1462,8 @@ CHARSET_INFO my_charset_ucs2_bin=
1, /* strxfrm_multiply */
2, /* mbminlen */
2, /* mbmaxlen */
0,
0, /* min_sort_char */
0xFFFF, /* max_sort_char */
&my_charset_ucs2_handler,
&my_collation_ucs2_bin_handler
};

View file

@ -8483,7 +8483,8 @@ CHARSET_INFO my_charset_ujis_japanese_ci=
1, /* strxfrm_multiply */
1, /* mbminlen */
3, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_ci_handler
};
@ -8506,7 +8507,8 @@ CHARSET_INFO my_charset_ujis_bin=
1, /* strxfrm_multiply */
1, /* mbminlen */
3, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_mb_bin_handler
};

View file

@ -2009,7 +2009,8 @@ CHARSET_INFO my_charset_utf8_general_ci=
1, /* strxfrm_multiply */
1, /* mbminlen */
3, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_ci_handler
};
@ -2033,7 +2034,8 @@ CHARSET_INFO my_charset_utf8_bin=
1, /* strxfrm_multiply */
1, /* mbminlen */
3, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_mb_bin_handler
};

View file

@ -629,7 +629,8 @@ CHARSET_INFO my_charset_cp1250_czech_ci =
2, /* strxfrm_multiply */
1, /* mbminlen */
1, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_8bit_handler,
&my_collation_czech_ci_handler
};