summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.bzrignore3
-rw-r--r--configure.in2
-rwxr-xr-xmyisam/ftbench/Ecompare.pl96
-rwxr-xr-xmyisam/ftbench/Ereport.pl53
-rwxr-xr-xmyisam/ftbench/ft-test-run.sh81
-rw-r--r--mysql-test/r/auto_increment.result38
-rw-r--r--mysql-test/r/ctype_collate.result24
-rw-r--r--mysql-test/r/ctype_many.result10
-rw-r--r--mysql-test/r/ctype_recoding.result8
-rw-r--r--mysql-test/t/auto_increment.test30
-rw-r--r--mysql-test/t/ctype_collate.test22
-rw-r--r--mysql-test/t/ctype_many.test10
-rw-r--r--mysql-test/t/ctype_recoding.test8
-rw-r--r--sql/handler.cc4
-rw-r--r--sql/mysqld.cc6
-rw-r--r--sql/protocol.cc5
-rw-r--r--sql/set_var.cc50
-rw-r--r--sql/set_var.h23
-rw-r--r--sql/share/charsets/Index.xml90
-rw-r--r--sql/share/charsets/cp1257.xml2
-rw-r--r--sql/share/charsets/greek.xml2
-rw-r--r--sql/share/charsets/hebrew.xml2
-rw-r--r--sql/share/charsets/keybcs2.xml2
-rw-r--r--sql/share/charsets/macce.xml2
-rw-r--r--sql/share/charsets/macroman.xml2
-rw-r--r--sql/sql_class.h6
-rw-r--r--sql/sql_db.cc1
-rw-r--r--sql/sql_union.cc70
-rw-r--r--sql/sql_yacc.yy49
-rw-r--r--strings/ctype-big5.c2
-rw-r--r--strings/ctype-euc_kr.c2
-rw-r--r--strings/ctype-gb2312.c2
-rw-r--r--strings/ctype-gbk.c2
-rw-r--r--strings/ctype-sjis.c2
-rw-r--r--strings/ctype-tis620.c2
-rw-r--r--strings/ctype-ujis.c2
-rw-r--r--strings/ctype-utf8.c4
37 files changed, 520 insertions, 199 deletions
diff --git a/.bzrignore b/.bzrignore
index c91e2d617b1..b3db91e7c59 100644
--- a/.bzrignore
+++ b/.bzrignore
@@ -602,3 +602,6 @@ vio/test-ssl
vio/test-sslclient
vio/test-sslserver
vio/viotest-ssl
+myisam/ftbench/var/*
+myisam/ftbench/data
+myisam/ftbench/t
diff --git a/configure.in b/configure.in
index d9380a68267..77ae969b5eb 100644
--- a/configure.in
+++ b/configure.in
@@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script.
AC_INIT(sql/mysqld.cc)
AC_CANONICAL_SYSTEM
# The Docs Makefile.am parses this line!
-AM_INIT_AUTOMAKE(mysql, 4.1.0-alpha)
+AM_INIT_AUTOMAKE(mysql, 4.1.1-alpha)
AM_CONFIG_HEADER(config.h)
PROTOCOL_VERSION=10
diff --git a/myisam/ftbench/Ecompare.pl b/myisam/ftbench/Ecompare.pl
new file mode 100755
index 00000000000..4bcee1fb588
--- /dev/null
+++ b/myisam/ftbench/Ecompare.pl
@@ -0,0 +1,96 @@
+#!/usr/bin/perl
+
+# compares out-files (as created by Ereport.pl) from dir1/*.out and dir2/*.out
+# for each effectiveness column computes the probability of the hypothesis
+# "Both files have the same effectiveness"
+
+# sign test is used to verify that test results are statistically
+# significant to support the hypothesis. Function is computed on the fly.
+
+# basic formula is \sum_{r=0}^R C_N^r 2^{-N}
+# As N can be big, we'll work with logarithms
+$log2=log(2);
+sub probab {
+ my $N=shift, $R=shift;
+
+ my $r, $sum=0;
+
+ for $r (0..$R) {
+ $sum+=exp(logfac($N)-logfac($r)-logfac($N-$r)-$N*$log2);
+ }
+ return $sum;
+}
+
+# log(N!)
+# for N<20 exact value from the table (below) is taken
+# otherwise, Stirling approximation for N! is used
+sub logfac {
+ my $n=shift; die "n=$n<0" if $n<0;
+ return $logfactab[$n] if $n<=$#logfactab;
+ return $n*log($n)-$n+log(2*3.14159265358*$n)/2;
+}
+@logfactab=(
+0, 0, 0.693147180559945, 1.79175946922805, 3.17805383034795,
+4.78749174278205, 6.57925121201010, 8.52516136106541, 10.6046029027453,
+12.8018274800815, 15.1044125730755, 17.5023078458739, 19.9872144956619,
+22.5521638531234, 25.1912211827387, 27.8992713838409, 30.6718601060807,
+33.5050734501369, 36.3954452080331, 39.3398841871995, 42.3356164607535,
+);
+
+############################# main () ###############################
+#$p=shift; $m=shift; $p-=$m;
+#if($p>$m) {
+# print "1 > 2 [+$p-$m]: ", probab($p+$m, $m), "\n";
+#} elsif($p<$m) {
+# print "1 < 2 [+$p-$m]: ", probab($p+$m, $p), "\n";
+#} else {
+# print "1 = 2 [+$p-$m]: ", probab($p+$m, $m), "\n";
+#}
+#exit;
+
+die "Use: $0 dir1 dir2\n" unless @ARGV==2 &&
+ -d ($dir1=shift) && -d ($dir2=shift);
+$_=`cd $dir1; echo *.out`;
+s/\.out\b//g;
+$total="";
+
+for $file (split) {
+ open(OUT1,$out1="$dir1/$file.out") || die "Cannot open $out1: $!";
+ open(OUT2,$out2="$dir2/$file.out") || die "Cannot open $out2: $!";
+
+ @p=@m=();
+ while(!eof(OUT1) || !eof(OUT2)) {
+ $_=<OUT1>; @l1=split; shift @l1;
+ $_=<OUT2>; @l2=split; shift @l2;
+
+ die "Number of columns differ in line $.\n" unless $#l1 == $#l2;
+
+ for (0..$#l1) {
+ $p[$_]+= $l1[$_] > $l2[$_];
+ $m[$_]+= $l1[$_] < $l2[$_];
+ }
+ }
+
+ for (0..$#l1) {
+ $pp[$_]+=$p[$_]; $mm[$_]+=$m[$_];
+ $total.=rep($file, ($#l1 ? $_ : undef), $p[$_], $m[$_]);
+ }
+ close OUT1;
+ close OUT2;
+}
+
+for (0..$#l1) {
+ rep($total, ($#l1 ? $_ : undef), $pp[$_], $mm[$_]);
+}
+
+sub rep {
+ my ($test, $n, $p, $m, $c, $r)=@_;
+
+ if ($p>$m) { $c=">"; $r="+"; }
+ elsif($p<$m) { $c="<"; $r="-"; }
+ else { $c="="; $r="="; }
+ $n=" $n: " if defined $n;
+ printf "%-8s $n $dir1 $c $dir2 [+%03d-%03d]: %16.15f\n",
+ $test, $p, $m, probab($p+$m, ($p>=$m ? $m : $p));
+ $r;
+}
diff --git a/myisam/ftbench/Ereport.pl b/myisam/ftbench/Ereport.pl
new file mode 100755
index 00000000000..aac06503849
--- /dev/null
+++ b/myisam/ftbench/Ereport.pl
@@ -0,0 +1,53 @@
+#!/usr/bin/perl
+
+die "Use: $0 eval_output qrels_file\n" unless @ARGV==2;
+
+open(EOUT,$eout=shift) || die "Cannot open $eout: $!";
+open(RELJ,$relj=shift) || die "Cannot open $relj: $!";
+
+$_=<EOUT>;
+die "$eout must start with a number!\n "unless /^[1-9][0-9]*\n/;
+$ndocs=$_+0;
+
+$qid=0;
+$relj_str=<RELJ>;
+$eout_str=<EOUT>;
+
+while(!eof(RELJ) || !eof(EOUT)) {
+ ++$qid;
+ %dq=();
+ $A=$B=$AB=0;
+ $Ravg=$Pavg=0;
+
+ while($relj_str =~ /^0*$qid\s+(\d+)/) {
+ ++$A;
+ $dq{$1+0}=1;
+ last unless $relj_str=<RELJ>;
+ }
+ # Favg measure = 1/(a/Pavg+(1-a)/Ravg)
+sub Favg { my $a=shift; $Pavg*$Ravg ? 1/($a/$Pavg+(1-$a)/$Ravg) : 0; }
+ # F0 : a=0 -- ignore precision
+ # F5 : a=0.5
+ # F1 : a=1 -- ignore recall
+ while($eout_str =~ /^$qid\s+(\d+)\s+(\d+\.\d+)/) {
+ $B++;
+ $AB++ if $dq{$1+0};
+ $Ravg+=$AB;
+ $Pavg+=$AB/$B;
+ last unless $eout_str=<EOUT>;
+ }
+ next unless $A;
+
+ $Ravg/=$B*$A if $B;
+ $Pavg/=$B if $B;
+
+ write;
+format=
+@##### @#.#######
+$qid, Favg(0.5)
+.
+}
+
+exit 0;
+
+
diff --git a/myisam/ftbench/ft-test-run.sh b/myisam/ftbench/ft-test-run.sh
new file mode 100755
index 00000000000..4c81cac6d4f
--- /dev/null
+++ b/myisam/ftbench/ft-test-run.sh
@@ -0,0 +1,81 @@
+#!/bin/sh -x
+
+if [ ! -x ./ft-test-run.sh ] ; then
+ echo "Usage: ./ft-test-run.sh"
+ exit 1
+fi
+
+BASE=`pwd`
+DATA=$BASE/var
+ROOT=`cd ../..; pwd`
+MYSQLD=$ROOT/sql/mysqld
+MYSQL=$ROOT/client/mysql
+MYSQLADMIN=$ROOT/client/mysqladmin
+SOCK=$DATA/mysql.sock
+PID=$DATA/mysql.pid
+H=../ftdefs.h
+OPTS="--no-defaults --socket=$SOCK --character-sets-dir=$ROOT/sql/share/charsets"
+
+# --ft_min_word_len=#
+# --ft_max_word_len=#
+# --ft_max_word_len_for_sort=#
+# --ft_stopword_file=name
+# --key_buffer_size=#
+
+stop_myslqd()
+{
+ [ -S $SOCK ] && $MYSQLADMIN $OPTS shutdown
+ [ -f $PID ] && kill `cat $PID` && sleep 15 && [ -f $PID ] && kill -9 `cat $PID`
+}
+
+if [ ! -d t/BEST ] ; then
+ echo "No ./t/BEST directory! Aborting..."
+ exit 1
+fi
+rm -f t/BEST/report.txt
+if [ -w $H ] ; then
+ echo "$H is writeable! Aborting..."
+ exit 1
+fi
+
+for batch in t/BEST t/* ; do
+ A=`ls $batch/*.out`
+ [ ! -d $batch -o -n "$A" ] && continue
+ rm -f $H
+ ln -s $BASE/$batch/ftdefs.h $H
+ touch $H
+ OPTS="--defaults-file=$BASE/$batch/my.cnf --socket=$SOCK --character-sets-dir=$ROOT/sql/share/charsets"
+ stop_myslqd
+ rm $MYSQLD
+ (cd $ROOT; gmake)
+
+ for prog in $MYSQLD $MYSQL $MYSQLADMIN ; do
+ if [ ! -x $prog ] ; then
+ echo "No $prog"
+ exit 1
+ fi
+ done
+
+ rm -rf var 2>&1 >/dev/null
+ mkdir var
+ mkdir var/test
+
+ $MYSQLD $OPTS --basedir=$BASE --skip-bdb --pid-file=$PID \
+ --language=$ROOT/sql/share/english \
+ --skip-grant-tables --skip-innodb \
+ --skip-networking --tmpdir=$DATA &
+
+ $MYSQLADMIN $OPTS --connect_timeout=60 ping
+ if [ $? != 0 ] ; then
+ echo "$MYSQLD refused to start"
+ exit 1
+ fi
+ for test in `cd data; echo *.test|sed "s/\.test\>//g"` ; do
+ $MYSQL $OPTS --skip-column-names test <data/$test.test >var/$test.eval
+ ./Ereport.pl var/$test.eval data/$test.relj > $batch/$test.out || exit
+ done
+ stop_myslqd
+ rm -f $H
+ [ $batch -ef t/BEST ] || ./Ecompare.pl t/BEST $batch >> t/BEST/report.txt
+done
+
diff --git a/mysql-test/r/auto_increment.result b/mysql-test/r/auto_increment.result
index e79e6aab56b..2facb504294 100644
--- a/mysql-test/r/auto_increment.result
+++ b/mysql-test/r/auto_increment.result
@@ -105,3 +105,41 @@ Table Op Msg_type Msg_text
test.t1 check warning Found row where the auto_increment column has the value 0
test.t1 check status OK
drop table t1;
+create table t1 (i tinyint unsigned not null auto_increment primary key);
+insert into t1 set i = 254;
+insert into t1 set i = null;
+select last_insert_id();
+last_insert_id()
+255
+insert into t1 set i = null;
+Duplicate entry '255' for key 1
+select last_insert_id();
+last_insert_id()
+255
+drop table t1;
+create table t1 (i tinyint unsigned not null auto_increment, key (i));
+insert into t1 set i = 254;
+insert into t1 set i = null;
+select last_insert_id();
+last_insert_id()
+255
+insert into t1 set i = null;
+select last_insert_id();
+last_insert_id()
+255
+drop table t1;
+create table t1 (i tinyint unsigned not null auto_increment primary key, b int, unique (b));
+insert into t1 values (NULL, 10);
+select last_insert_id();
+last_insert_id()
+1
+insert into t1 values (NULL, 15);
+select last_insert_id();
+last_insert_id()
+2
+insert into t1 values (NULL, 10);
+Duplicate entry '10' for key 2
+select last_insert_id();
+last_insert_id()
+3
+drop table t1;
diff --git a/mysql-test/r/ctype_collate.result b/mysql-test/r/ctype_collate.result
index 0be2bf5f54b..af231bb7930 100644
--- a/mysql-test/r/ctype_collate.result
+++ b/mysql-test/r/ctype_collate.result
@@ -510,11 +510,11 @@ t1 CREATE TABLE `t1` (
SHOW FIELDS FROM t1;
Field Type Collation Null Key Default Extra
latin1_f char(32) latin1_bin YES NULL
-SET NAMES 'latin1';
+SET CHARACTER SET 'latin1';
SHOW VARIABLES LIKE 'client_collation';
Variable_name Value
client_collation latin1_swedish_ci
-SET NAMES latin1;
+SET CHARACTER SET latin1;
SHOW VARIABLES LIKE 'client_collation';
Variable_name Value
client_collation latin1_swedish_ci
@@ -524,51 +524,51 @@ client_collation latin1_swedish_ci
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
charset('a') collation('a') coercibility('a') 'a'='A'
latin1 latin1_swedish_ci 3 1
-SET NAMES latin1 COLLATE latin1_bin;
+SET CHARACTER SET latin1 COLLATE latin1_bin;
SHOW VARIABLES LIKE 'client_collation';
Variable_name Value
client_collation latin1_bin
-SET NAMES LATIN1 COLLATE Latin1_Bin;
+SET CHARACTER SET LATIN1 COLLATE Latin1_Bin;
SHOW VARIABLES LIKE 'client_collation';
Variable_name Value
client_collation latin1_bin
-SET NAMES 'latin1' COLLATE 'latin1_bin';
+SET CHARACTER SET 'latin1' COLLATE 'latin1_bin';
SHOW VARIABLES LIKE 'client_collation';
Variable_name Value
client_collation latin1_bin
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
charset('a') collation('a') coercibility('a') 'a'='A'
-latin1 latin1_bin 3 0
-SET NAMES koi8r;
+latin1 latin1_swedish_ci 3 1
+SET CHARACTER SET koi8r;
SHOW VARIABLES LIKE 'client_collation';
Variable_name Value
client_collation koi8r_general_ci
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
charset('a') collation('a') coercibility('a') 'a'='A'
latin1 latin1_swedish_ci 3 1
-SET NAMES koi8r COLLATE koi8r_bin;
+SET CHARACTER SET koi8r COLLATE koi8r_bin;
SHOW VARIABLES LIKE 'client_collation';
Variable_name Value
client_collation koi8r_bin
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
charset('a') collation('a') coercibility('a') 'a'='A'
latin1 latin1_swedish_ci 3 1
-SET NAMES koi8r COLLATE DEFAULT;
+SET CHARACTER SET koi8r COLLATE DEFAULT;
SHOW VARIABLES LIKE 'client_collation';
Variable_name Value
client_collation koi8r_general_ci
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
charset('a') collation('a') coercibility('a') 'a'='A'
latin1 latin1_swedish_ci 3 1
-SET NAMES DEFAULT;
+SET CHARACTER SET DEFAULT;
SHOW VARIABLES LIKE 'client_collation';
Variable_name Value
client_collation latin1_swedish_ci
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
charset('a') collation('a') coercibility('a') 'a'='A'
latin1 latin1_swedish_ci 3 1
-SET NAMES latin1 COLLATE koi8r;
+SET CHARACTER SET latin1 COLLATE koi8r;
COLLATION 'koi8r_general_ci' is not valid for CHARACTER SET 'latin1'
-SET NAMES 'DEFAULT';
+SET CHARACTER SET 'DEFAULT';
Unknown character set: 'DEFAULT'
DROP TABLE t1;
diff --git a/mysql-test/r/ctype_many.result b/mysql-test/r/ctype_many.result
index 4d31ab6c274..d6b6429d021 100644
--- a/mysql-test/r/ctype_many.result
+++ b/mysql-test/r/ctype_many.result
@@ -1,5 +1,5 @@
DROP TABLE IF EXISTS t1;
-SET NAMES latin1;
+SET CHARACTER SET latin1;
CREATE TABLE t1 (
comment CHAR(32) ASCII NOT NULL,
koi8_ru_f CHAR(32) CHARACTER SET koi8r NOT NULL
@@ -158,7 +158,7 @@ INSERT INTO t1 (koi8_ru_f,comment) VALUES (_koi8r'ø','CYR CAPIT SOFT SIGN');
INSERT INTO t1 (koi8_ru_f,comment) VALUES (_koi8r'ü','CYR CAPIT E');
INSERT INTO t1 (koi8_ru_f,comment) VALUES (_koi8r'à','CYR CAPIT YU');
INSERT INTO t1 (koi8_ru_f,comment) VALUES (_koi8r'ñ','CYR CAPIT YA');
-SET NAMES utf8;
+SET CHARACTER SET utf8;
SELECT koi8_ru_f,MIN(comment),COUNT(*) FROM t1 GROUP BY 1;
koi8_ru_f MIN(comment) COUNT(*)
a LAT CAPIT A 2
@@ -221,7 +221,7 @@ z LAT CAPIT Z 2
Ñ CYR CAPIT YA 2
ALTER TABLE t1 ADD utf8_f CHAR(32) CHARACTER SET utf8 NOT NULL;
UPDATE t1 SET utf8_f=CONVERT(koi8_ru_f USING utf8);
-SET NAMES koi8r;
+SET CHARACTER SET koi8r;
SELECT * FROM t1;
comment koi8_ru_f utf8_f
LAT SMALL A a a
@@ -1300,7 +1300,7 @@ CYR CAPIT YA CYR CAPIT YA
CYR CAPIT YA CYR SMALL YA
CYR SMALL YA CYR CAPIT YA
CYR SMALL YA CYR SMALL YA
-SET NAMES utf8;
+SET CHARACTER SET utf8;
ALTER TABLE t1 ADD ucs2_f CHAR(32) CHARACTER SET ucs2;
ALTER TABLE t1 CHANGE ucs2_f ucs2_f CHAR(32) UNICODE NOT NULL;
INSERT INTO t1 (ucs2_f,comment) VALUES (0x0391,'GREEK CAPIT ALPHA');
@@ -1471,7 +1471,7 @@ ARMENIAN SMALL GIM Õ£ Õ£ Õ£
ARMENIAN SMALL DA Õ¤ Õ¤ Õ¤
ARMENIAN SMALL ECH Õ¥ Õ¥ Õ¥
ARMENIAN SMALL ZA Õ¦ Õ¦ Õ¦
-SET NAMES 'binary';
+SET CHARACTER SET 'binary';
SELECT * FROM t1;
comment koi8_ru_f utf8_f bin_f ucs2_f armscii8_f greek_f
LAT SMALL A a a a
diff --git a/mysql-test/r/ctype_recoding.result b/mysql-test/r/ctype_recoding.result
index ea4ec8d068c..fb813e394f4 100644
--- a/mysql-test/r/ctype_recoding.result
+++ b/mysql-test/r/ctype_recoding.result
@@ -1,4 +1,4 @@
-SET NAMES koi8r;
+SET CHARACTER SET koi8r;
DROP TABLE IF EXISTS ÔÁÂÌÉÃÁ;
CREATE TABLE ÔÁÂÌÉÃÁ
(
@@ -15,7 +15,7 @@ Table Create Table
SHOW FIELDS FROM ÔÁÂÌÉÃÁ;
Field Type Collation Null Key Default Extra
ÐÏÌÅ char(32) character set koi8r koi8r_general_ci
-SET NAMES cp1251;
+SET CHARACTER SET cp1251;
SHOW TABLES;
Tables_in_test
òàáëèöà
@@ -27,7 +27,7 @@ Table Create Table
SHOW FIELDS FROM òàáëèöà;
Field Type Collation Null Key Default Extra
ïîëå char(32) character set koi8r koi8r_general_ci
-SET NAMES utf8;
+SET CHARACTER SET utf8;
SHOW TABLES;
Tables_in_test
таблица
@@ -39,5 +39,5 @@ Table Create Table
SHOW FIELDS FROM таблица;
Field Type Collation Null Key Default Extra
поле char(32) character set koi8r koi8r_general_ci
-SET NAMES koi8r;
+SET CHARACTER SET koi8r;
DROP TABLE ÔÁÂÌÉÃÁ;
diff --git a/mysql-test/t/auto_increment.test b/mysql-test/t/auto_increment.test
index d7f67fe80d4..63fdfded6d0 100644
--- a/mysql-test/t/auto_increment.test
+++ b/mysql-test/t/auto_increment.test
@@ -72,3 +72,33 @@ select * from t1;
check table t1;
drop table t1;
+#
+# last_insert_id() madness
+#
+create table t1 (i tinyint unsigned not null auto_increment primary key);
+insert into t1 set i = 254;
+insert into t1 set i = null;
+select last_insert_id();
+--error 1062
+insert into t1 set i = null;
+select last_insert_id();
+drop table t1;
+
+create table t1 (i tinyint unsigned not null auto_increment, key (i));
+insert into t1 set i = 254;
+insert into t1 set i = null;
+select last_insert_id();
+insert into t1 set i = null;
+select last_insert_id();
+drop table t1;
+
+create table t1 (i tinyint unsigned not null auto_increment primary key, b int, unique (b));
+insert into t1 values (NULL, 10);
+select last_insert_id();
+insert into t1 values (NULL, 15);
+select last_insert_id();
+--error 1062
+insert into t1 values (NULL, 10);
+select last_insert_id();
+drop table t1;
+
diff --git a/mysql-test/t/ctype_collate.test b/mysql-test/t/ctype_collate.test
index 2740ca24eb3..431799ac65c 100644
--- a/mysql-test/t/ctype_collate.test
+++ b/mysql-test/t/ctype_collate.test
@@ -127,35 +127,35 @@ ALTER TABLE t1 CHARACTER SET latin1 COLLATE latin1_bin;
SHOW CREATE TABLE t1;
SHOW FIELDS FROM t1;
-SET NAMES 'latin1';
+SET CHARACTER SET 'latin1';
SHOW VARIABLES LIKE 'client_collation';
-SET NAMES latin1;
+SET CHARACTER SET latin1;
SHOW VARIABLES LIKE 'client_collation';
SHOW VARIABLES LIKE 'client_collation';
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
-SET NAMES latin1 COLLATE latin1_bin;
+SET CHARACTER SET latin1 COLLATE latin1_bin;
SHOW VARIABLES LIKE 'client_collation';
-SET NAMES LATIN1 COLLATE Latin1_Bin;
+SET CHARACTER SET LATIN1 COLLATE Latin1_Bin;
SHOW VARIABLES LIKE 'client_collation';
-SET NAMES 'latin1' COLLATE 'latin1_bin';
+SET CHARACTER SET 'latin1' COLLATE 'latin1_bin';
SHOW VARIABLES LIKE 'client_collation';
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
-SET NAMES koi8r;
+SET CHARACTER SET koi8r;
SHOW VARIABLES LIKE 'client_collation';
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
-SET NAMES koi8r COLLATE koi8r_bin;
+SET CHARACTER SET koi8r COLLATE koi8r_bin;
SHOW VARIABLES LIKE 'client_collation';
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
-SET NAMES koi8r COLLATE DEFAULT;
+SET CHARACTER SET koi8r COLLATE DEFAULT;
SHOW VARIABLES LIKE 'client_collation';
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
-SET NAMES DEFAULT;
+SET CHARACTER SET DEFAULT;
SHOW VARIABLES LIKE 'client_collation';
SELECT charset('a'),collation('a'),coercibility('a'),'a'='A';
--error 1251
-SET NAMES latin1 COLLATE koi8r;
+SET CHARACTER SET latin1 COLLATE koi8r;
--error 1115
-SET NAMES 'DEFAULT';
+SET CHARACTER SET 'DEFAULT';
DROP TABLE t1;
diff --git a/mysql-test/t/ctype_many.test b/mysql-test/t/ctype_many.test
index 05f3687d330..8378ef35685 100644
--- a/mysql-test/t/ctype_many.test
+++ b/mysql-test/t/ctype_many.test
@@ -2,7 +2,7 @@
DROP TABLE IF EXISTS t1;
--enable_warnings
-SET NAMES latin1;
+SET CHARACTER SET latin1;
CREATE TABLE t1 (
comment CHAR(32) ASCII NOT NULL,
@@ -137,12 +137,12 @@ INSERT INTO t1 (koi8_ru_f,comment) VALUES (_koi8r'ü','CYR CAPIT E');
INSERT INTO t1 (koi8_ru_f,comment) VALUES (_koi8r'à','CYR CAPIT YU');
INSERT INTO t1 (koi8_ru_f,comment) VALUES (_koi8r'ñ','CYR CAPIT YA');
-SET NAMES utf8;
+SET CHARACTER SET utf8;
SELECT koi8_ru_f,MIN(comment),COUNT(*) FROM t1 GROUP BY 1;
ALTER TABLE t1 ADD utf8_f CHAR(32) CHARACTER SET utf8 NOT NULL;
UPDATE t1 SET utf8_f=CONVERT(koi8_ru_f USING utf8);
-SET NAMES koi8r;
+SET CHARACTER SET koi8r;
SELECT * FROM t1;
ALTER TABLE t1 ADD bin_f CHAR(32) BYTE NOT NULL;
@@ -165,7 +165,7 @@ FROM t1 t11,t1 t12
WHERE t11.koi8_ru_f=CONVERT(t12.utf8_f USING koi8r)
ORDER BY t12.utf8_f,t11.comment,t12.comment;
-SET NAMES utf8;
+SET CHARACTER SET utf8;
ALTER TABLE t1 ADD ucs2_f CHAR(32) CHARACTER SET ucs2;
ALTER TABLE t1 CHANGE ucs2_f ucs2_f CHAR(32) UNICODE NOT NULL;
@@ -199,7 +199,7 @@ UPDATE t1 SET armscii8_f=CONVERT(ucs2_f USING armscii8) WHERE comment LIKE _lati
UPDATE t1 SET utf8_f=CONVERT(ucs2_f USING utf8) WHERE utf8_f=_utf8'';
UPDATE t1 SET ucs2_f=CONVERT(utf8_f USING ucs2) WHERE ucs2_f=_ucs2'';
SELECT * FROM t1;
-SET NAMES 'binary';
+SET CHARACTER SET 'binary';
SELECT * FROM t1;
SELECT min(comment),count(*) FROM t1 GROUP BY ucs2_f;
DROP TABLE t1;
diff --git a/mysql-test/t/ctype_recoding.test b/mysql-test/t/ctype_recoding.test
index c0b7139c791..0330bbd23b4 100644
--- a/mysql-test/t/ctype_recoding.test
+++ b/mysql-test/t/ctype_recoding.test
@@ -1,4 +1,4 @@
-SET NAMES koi8r;
+SET CHARACTER SET koi8r;
--disable_warnings
DROP TABLE IF EXISTS ÔÁÂÌÉÃÁ;
@@ -13,16 +13,16 @@ SHOW TABLES;
SHOW CREATE TABLE ÔÁÂÌÉÃÁ;
SHOW FIELDS FROM ÔÁÂÌÉÃÁ;
-SET NAMES cp1251;
+SET CHARACTER SET cp1251;
SHOW TABLES;
SHOW CREATE TABLE òàáëèöà;
SHOW FIELDS FROM òàáëèöà;
-SET NAMES utf8;
+SET CHARACTER SET utf8;
SHOW TABLES;
SHOW CREATE TABLE таблица;
SHOW FIELDS FROM таблица;
-SET NAMES koi8r;
+SET CHARACTER SET koi8r;
DROP TABLE ÔÁÂÌÉÃÁ;
diff --git a/sql/handler.cc b/sql/handler.cc
index 5353e78cd11..e288d590e88 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -660,8 +660,8 @@ void handler::update_auto_increment()
thd->next_insert_id=0; // Clear after use
else
nr=get_auto_increment();
- thd->insert_id((ulonglong) nr);
- table->next_number_field->store(nr);
+ if (!table->next_number_field->store(nr))
+ thd->insert_id((ulonglong) nr);
auto_increment_column_changed=1;
DBUG_VOID_RETURN;
}
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index a6338630568..7aa065f2177 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -2087,6 +2087,10 @@ static int init_common_variables(const char *conf_file_name, int argc,
#endif
if (!(default_charset_info= get_charset_by_name(sys_charset.value, MYF(MY_WME))))
return 1;
+ global_system_variables.result_collation= default_charset_info;
+ global_system_variables.client_collation= default_charset_info;
+ global_system_variables.literal_collation= default_charset_info;
+
charsets_list= list_charsets(MYF(MY_CS_COMPILED | MY_CS_CONFIG));
if (use_temp_pool && bitmap_init(&temp_pool,1024,1))
@@ -4566,7 +4570,7 @@ static void set_options(void)
sizeof(mysql_real_data_home)-1);
/* Set default values for some variables */
- global_system_variables.convert_result_charset= TRUE;
+ global_system_variables.result_collation= default_charset_info;
global_system_variables.client_collation= default_charset_info;
global_system_variables.literal_collation= default_charset_info;
global_system_variables.table_type= DB_TYPE_MYISAM;
diff --git a/sql/protocol.cc b/sql/protocol.cc
index 195fec80ed0..99b815a7840 100644
--- a/sql/protocol.cc
+++ b/sql/protocol.cc
@@ -724,7 +724,7 @@ bool Protocol_simple::store(const char *from, uint length,
bool Protocol_simple::store(const char *from, uint length,
CHARSET_INFO *fromcs)
{
- CHARSET_INFO *tocs= this->thd->result_charset(fromcs);
+ CHARSET_INFO *tocs= this->thd->variables.result_collation;
#ifndef DEBUG_OFF
DBUG_ASSERT(field_types == 0 ||
field_types[field_pos] == MYSQL_TYPE_DECIMAL ||
@@ -834,8 +834,7 @@ bool Protocol_simple::store(Field *field)
field->val_str(&str,&str);
if (!my_charset_same(field->charset(), this->thd->charset()) &&
(field->charset() != &my_charset_bin) &&
- (this->thd->charset() != &my_charset_bin) &&
- (this->thd->variables.convert_result_charset))
+ (this->thd->charset() != &my_charset_bin))
{
convert.copy(str.ptr(), str.length(), str.charset(), this->thd->charset());
return net_store_data(convert.ptr(), convert.length());
diff --git a/sql/set_var.cc b/sql/set_var.cc
index ddebf47a25d..8c224a745c6 100644
--- a/sql/set_var.cc
+++ b/sql/set_var.cc
@@ -110,8 +110,6 @@ sys_var_bool_ptr sys_concurrent_insert("concurrent_insert",
&myisam_concurrent_insert);
sys_var_long_ptr sys_connect_timeout("connect_timeout",
&connect_timeout);
-sys_var_thd_bool sys_convert_result_charset("convert_result_charset",
- &SV::convert_result_charset);
sys_var_enum sys_delay_key_write("delay_key_write",
&delay_key_write_options,
&delay_key_write_typelib,
@@ -202,6 +200,7 @@ sys_var_thd_ulong sys_read_buff_size("read_buffer_size",
&SV::read_buff_size);
sys_var_thd_ulong sys_read_rnd_buff_size("read_rnd_buffer_size",
&SV::read_rnd_buff_size);
+sys_var_result_collation sys_result_collation("result_collation");
sys_var_long_ptr sys_rpl_recovery_rank("rpl_recovery_rank",
&rpl_recovery_rank);
sys_var_long_ptr sys_query_cache_size("query_cache_size",
@@ -347,7 +346,6 @@ sys_var *sys_variables[]=
&sys_client_collation,
&sys_concurrent_insert,
&sys_connect_timeout,
- &sys_convert_result_charset,
&sys_default_week_format,
&sys_delay_key_write,
&sys_delayed_insert_limit,
@@ -408,6 +406,7 @@ sys_var *sys_variables[]=
&sys_rand_seed2,
&sys_read_buff_size,
&sys_read_rnd_buff_size,
+ &sys_result_collation,
&sys_rpl_recovery_rank,
&sys_safe_updates,
&sys_select_limit,
@@ -459,7 +458,6 @@ struct show_var_st init_vars[]= {
{sys_client_collation.name, (char*) &sys_client_collation, SHOW_SYS},
{sys_concurrent_insert.name,(char*) &sys_concurrent_insert, SHOW_SYS},
{sys_connect_timeout.name, (char*) &sys_connect_timeout, SHOW_SYS},
- {sys_convert_result_charset.name, (char*) &sys_convert_result_charset, SHOW_SYS},
{"datadir", mysql_real_data_home, SHOW_CHAR},
{"default_week_format", (char*) &sys_default_week_format, SHOW_SYS},
{sys_delay_key_write.name, (char*) &sys_delay_key_write, SHOW_SYS},
@@ -563,6 +561,7 @@ struct show_var_st init_vars[]= {
{sys_pseudo_thread_id.name, (char*) &sys_pseudo_thread_id, SHOW_SYS},
{sys_read_buff_size.name, (char*) &sys_read_buff_size, SHOW_SYS},
{sys_read_rnd_buff_size.name,(char*) &sys_read_rnd_buff_size, SHOW_SYS},
+ {sys_result_collation.name, (char*) &sys_result_collation, SHOW_SYS},
{sys_rpl_recovery_rank.name,(char*) &sys_rpl_recovery_rank, SHOW_SYS},
#ifdef HAVE_QUERY_CACHE
{sys_query_cache_limit.name,(char*) &sys_query_cache_limit, SHOW_SYS},
@@ -1237,7 +1236,7 @@ void sys_var_client_collation::set_default(THD *thd, enum_var_type type)
global_system_variables.client_collation= default_charset_info;
else
{
- thd->variables.client_collation= thd->db_charset;
+ thd->variables.client_collation= global_system_variables.client_collation;
}
}
@@ -1264,7 +1263,32 @@ void sys_var_literal_collation::set_default(THD *thd, enum_var_type type)
if (type == OPT_GLOBAL)
global_system_variables.literal_collation= default_charset_info;
else
- thd->variables.literal_collation= thd->db_charset;
+ thd->variables.literal_collation= global_system_variables.literal_collation;
+}
+
+bool sys_var_result_collation::update(THD *thd, set_var *var)
+{
+ if (var->type == OPT_GLOBAL)
+ global_system_variables.result_collation= var->save_result.charset;
+ else
+ thd->variables.result_collation= var->save_result.charset;
+ return 0;
+}
+
+byte *sys_var_result_collation::value_ptr(THD *thd, enum_var_type type)
+{
+ CHARSET_INFO *cs= ((type == OPT_GLOBAL) ?
+ global_system_variables.result_collation :
+ thd->variables.result_collation);
+ return cs ? (byte*) cs->name : (byte*) "";
+}
+
+void sys_var_result_collation::set_default(THD *thd, enum_var_type type)
+{
+ if (type == OPT_GLOBAL)
+ global_system_variables.result_collation= default_charset_info;
+ else
+ thd->variables.result_collation= global_system_variables.result_collation;
}
@@ -1274,22 +1298,14 @@ void sys_var_literal_collation::set_default(THD *thd, enum_var_type type)
int set_var_client_collation::check(THD *thd)
{
- client_charset= client_charset ? client_charset : thd->db_charset;
- client_collation= client_collation ? client_collation : client_charset;
- if (!my_charset_same(client_charset, client_collation))
- {
- my_error(ER_COLLATION_CHARSET_MISMATCH, MYF(0),
- client_collation->name, client_charset->csname);
- return -1;
- }
return 0;
}
int set_var_client_collation::update(THD *thd)
{
- thd->variables.client_collation= client_collation;
- thd->variables.literal_collation= client_collation;
- thd->variables.convert_result_charset= convert_result_charset;
+ thd->variables.client_collation= client_collation;
+ thd->variables.literal_collation= literal_collation;
+ thd->variables.result_collation= result_collation;
thd->protocol_simple.init(thd);
thd->protocol_prep.init(thd);
return 0;
diff --git a/sql/set_var.h b/sql/set_var.h
index 51f59981e14..69e6bc05a67 100644
--- a/sql/set_var.h
+++ b/sql/set_var.h
@@ -438,6 +438,15 @@ public:
byte *value_ptr(THD *thd, enum_var_type type);
};
+class sys_var_result_collation :public sys_var_collation
+{
+public:
+ sys_var_result_collation(const char *name_arg) :sys_var_collation(name_arg) {}
+ bool update(THD *thd, set_var *var);
+ void set_default(THD *thd, enum_var_type type);
+ byte *value_ptr(THD *thd, enum_var_type type);
+};
+
/* Variable that you can only read from */
@@ -546,14 +555,16 @@ public:
class set_var_client_collation: public set_var_base
{
- CHARSET_INFO *client_charset;
CHARSET_INFO *client_collation;
- my_bool convert_result_charset;
+ CHARSET_INFO *literal_collation;
+ CHARSET_INFO *result_collation;
public:
- set_var_client_collation(CHARSET_INFO *cset_arg,
- CHARSET_INFO *coll_arg ,my_bool conv_arg)
- :client_charset(cset_arg), client_collation(coll_arg),
- convert_result_charset(conv_arg)
+ set_var_client_collation(CHARSET_INFO *client_coll_arg,
+ CHARSET_INFO *literal_coll_arg,
+ CHARSET_INFO *result_coll_arg)
+ :client_collation(client_coll_arg),
+ literal_collation(literal_coll_arg),
+ result_collation(result_coll_arg)
{}
int check(THD *thd);
int update(THD *thd);
diff --git a/sql/share/charsets/Index.xml b/sql/share/charsets/Index.xml
index ec93d68ea8f..9b95326fe9e 100644
--- a/sql/share/charsets/Index.xml
+++ b/sql/share/charsets/Index.xml
@@ -17,7 +17,7 @@ To make maintaining easier please:
<alias>big-five</alias>
<alias>cn-big5</alias>
<alias>csbig5</alias>
- <collation name="big5" id="1" order="Chinese">
+ <collation name="big5_chinese_ci" id="1" order="Chinese">
<flag>primary</flag>
<flag>compiled"</flag>
</collation>
@@ -169,7 +169,7 @@ To make maintaining easier please:
<family>Japanese</family>
<description>EUC-JP Japanese</description>
<alias>euc-jp</alias>
- <collation name="ujis" id="12" order="Japanese" flag="primary"/>
+ <collation name="ujis_japanese_ci" id="12" order="Japanese" flag="primary"/>
</charset>
<charset name="sjis">
@@ -178,7 +178,7 @@ To make maintaining easier please:
<alias>s-jis</alias>
<alias>shift-jis</alias>
<alias>x-sjis</alias>
- <collation name="sjis" id="13" order="Japanese" flag="primary"/>
+ <collation name="sjis_japanese_ci" id="13" order="Japanese" flag="primary"/>
</charset>
<charset name="cp1251">
@@ -224,15 +224,15 @@ To make maintaining easier please:
<alias>csisolatinhebrew</alias>
<alias>iso-8859-8</alias>
<alias>iso-ir-138</alias>
- <collation name="hebrew" id="16" order="Hebrew" flag="primary"/>
- <collation name="hebrew_bin" id="71" order="Binary" flag="binary"/>
+ <collation name="hebrew_general_ci" id="16" order="Hebrew" flag="primary"/>
+ <collation name="hebrew_bin" id="71" order="Binary" flag="binary"/>
</charset>
<charset name="tis620">
<family>Thai</family>
<description>TIS620 Thai</description>
<alias>tis-620</alias>
- <collation name="tis620" id="18" order="Thai">
+ <collation name="tis620_thai_ci" id="18" order="Thai">
<flag>primary</flag>
<flag>compiled</flag>
</collation>
@@ -243,7 +243,7 @@ To make maintaining easier please:
<description>EUC-KR Korean</description>
<alias>euc_kr</alias>
<alias>euc-kr</alias>
- <collation name="euckr" id="19" order="Korean">
+ <collation name="euckr_korean_ci" id="19" order="Korean">
<flag>primary</flag>
<flag>compiled"</flag>
</collation>
@@ -283,7 +283,7 @@ To make maintaining easier please:
<description>GB2312 Simplified Chinese</description>
<alias>chinese</alias>
<alias>iso-ir-58</alias>
- <collation name="gb2312" id="24" order="Chinese">
+ <collation name="gb2312_chinese_ci" id="24" order="Chinese">
<flag>primary</flag>
<flag>compiled"</flag>
</collation>
@@ -297,8 +297,8 @@ To make maintaining easier please:
<alias>greek8</alias>
<alias>iso-8859-7</alias>
<alias>iso-ir-126</alias>
- <collation name="greek" id="25" order="Greek" flag="primary"/>
- <collation name="greek_bin" id="70" order="Binary" flag="binary"/>
+ <collation name="greek_general_ci" id="25" order="Greek" flag="primary"/>
+ <collation name="greek_bin" id="70" order="Binary" flag="binary"/>
</charset>
<charset name="cp1250">
@@ -323,7 +323,7 @@ To make maintaining easier please:
<family>East Asian</family>
<description>GBK Simplified Chinese</description>
<alias>cp936</alias>
- <collation name="gbk" id="28" order="Chinese">
+ <collation name="gbk_chinese_ci" id="28" order="Chinese">
<flag>primary</flag>
<flag>compiled</flag>
</collation>
@@ -336,18 +336,12 @@ To make maintaining easier please:
<alias>windows-1257</alias>
<collation name="cp1257_lithuanian_ci" id="29" order="Lithuanian"/>
<collation name="cp1257_bin" id="58" order="Binary" flag="binary"/>
- <collation name="cp1257_ci_ai" id="59" flag="primary">
- <order>Latvian</order>
- <order>Lithuanian</order>
- </collation>
- <collation name="cp1257_ci" id="60">
- <order>Latvian</order>
- <order>Lithuanian</order>
- </collation>
- <collation name="cp1257_cs" id="61">
+ <collation name="cp1257_general_ci" id="59" flag="primary">
<order>Latvian</order>
<order>Lithuanian</order>
</collation>
+ <!--collation name="cp1257_ci" id="60"/-->
+ <!--collation name="cp1257_cs" id="61"/-->
</charset>
<charset name="latin5">
@@ -375,14 +369,14 @@ To make maintaining easier please:
<family>Unicode</family>
<description>UTF-8 Unicode</description>
<alias>utf-8</alias>
- <collation name="utf8" id="33" flag="primary"/>
- <collation name="utf8_bin" id="83" flag="binary"/>
+ <collation name="utf8_general_ci" id="33" flag="primary"/>
+ <collation name="utf8_bin" id="83" flag="binary"/>
</charset>
<charset name="ucs2">
<family>Unicode</family>
<description>UCS-2 Unicode</description>
- <collation name="ucs2" id="35" flag="primary"/>
+ <collation name="ucs2_general_ci" id="35" flag="primary"/>
</charset>
<charset name="cp866">
@@ -399,15 +393,15 @@ To make maintaining easier please:
<charset name="keybcs2">
<family>Central European</family>
<description>DOS Kamenicky Czech-Slovak</description>
- <collation name="keybcs2" id="37" order="Czech" flag="primary"/>
- <collation name="keybcs2_bin" id="73" order="Binary" flag="binary"/>
+ <collation name="keybcs2_general_ci" id="37" order="Czech" flag="primary"/>
+ <collation name="keybcs2_bin" id="73" order="Binary" flag="binary"/>
</charset>
<charset name="macce">
<family>Central European</family>
<description>Mac Central European</description>
<alias>MacCentralEurope</alias>
- <collation name="macce" id="38" flag="primary">
+ <collation name="macce_general_ci" id="38" flag="primary">
<order>Hungarian</order>
<order>Polish</order>
<order>Romanian</order>
@@ -418,24 +412,8 @@ To make maintaining easier please:
</collation>
<collation name="macce_bin" id="43" order="Binary" flag="binary"/>
<!--collation name="macce_ci_ai" id="44"/-->
- <collation name="macce_ci" id="45">
- <order>Hungarian</order>
- <order>Polish</order>
- <order>Romanian</order>
- <order>Croatian</order>
- <order>Slovak</order>
- <order>Slovenian</order>
- <order>Sorbian</order>
- </collation>
- <collation name="macce_cs" id="46">
- <order>Hungarian</order>
- <order>Polish</order>
- <order>Romanian</order>
- <order>Croatian</order>
- <order>Slovak</order>
- <order>Slovenian</order>
- <order>Sorbian</order>
- </collation>
+ <!--collation name="macce_ci" id="45"/-->
+ <!--collation name="macce_cs" id="46"/-->
</charset>
<charset name="macroman">
@@ -444,7 +422,7 @@ To make maintaining easier please:
<alias>Mac</alias>
<alias>Macintosh</alias>
<alias>csmacintosh</alias>
- <collation name="macroman" id="39" flag="primary">
+ <collation name="macroman_general_ci" id="39" flag="primary">
<order>Dutch</order>
<order>English</order>
<order>French</order>
@@ -455,27 +433,9 @@ To make maintaining easier please:
<order>Spanish</order>
</collation>
<collation name="macroman_bin" id="53" order="Binary" flag="binary"/>
- <collation name="macroman_ci" id="54">
- <order>Dutch</order>
- <order>English</order>
- <order>French</order>
- <order>German Duden</order>
- <order>Italian</order>
- <order>Latin</order>
- <order>Portuguese</order>
- <order>Spanish</order>
- </collation>
+ <!--collation name="macroman_ci" id="54"/-->
<!--collation name="macroman_ci_ai" id="55"/-->
- <collation name="macroman_cs" id="56">
- <order>Dutch</order>
- <order>English</order>
- <order>French</order>
- <order>German Duden</order>
- <order>Italian</order>
- <order>Latin</order>
- <order>Portuguese</order>
- <order>Spanish</order>
- </collation>
+ <!--collation name="macroman_cs" id="56"/-->
</charset>
<charset name="cp852">
diff --git a/sql/share/charsets/cp1257.xml b/sql/share/charsets/cp1257.xml
index adefac80c8b..bd4489a5a79 100644
--- a/sql/share/charsets/cp1257.xml
+++ b/sql/share/charsets/cp1257.xml
@@ -118,7 +118,7 @@
<collation name="cp1257_bin" flag="binary"/>
-<collation name="cp1257_ci_ai">
+<collation name="cp1257_general_ci">
<map>
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
diff --git a/sql/share/charsets/greek.xml b/sql/share/charsets/greek.xml
index 6d8d0954655..defeaf049c8 100644
--- a/sql/share/charsets/greek.xml
+++ b/sql/share/charsets/greek.xml
@@ -97,7 +97,7 @@
</unicode>
-<collation name="greek">
+<collation name="greek_general_ci">
<map>
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
diff --git a/sql/share/charsets/hebrew.xml b/sql/share/charsets/hebrew.xml
index fbd4ea0c1d2..ec3fa242ced 100644
--- a/sql/share/charsets/hebrew.xml
+++ b/sql/share/charsets/hebrew.xml
@@ -93,7 +93,7 @@
</unicode>
-<collation name="hebrew">
+<collation name="hebrew_general_ci">
<map>
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
diff --git a/sql/share/charsets/keybcs2.xml b/sql/share/charsets/keybcs2.xml
index e509207c1c5..6180dd8550d 100644
--- a/sql/share/charsets/keybcs2.xml
+++ b/sql/share/charsets/keybcs2.xml
@@ -93,7 +93,7 @@
</unicode>
-<collation name="keybcs2">
+<collation name="keybcs2_general_ci">
<map>
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
diff --git a/sql/share/charsets/macce.xml b/sql/share/charsets/macce.xml
index 0f39cb14b31..7e955157bb7 100644
--- a/sql/share/charsets/macce.xml
+++ b/sql/share/charsets/macce.xml
@@ -93,7 +93,7 @@
</unicode>
-<collation name="macce">
+<collation name="macce_general_ci">
<map>
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
diff --git a/sql/share/charsets/macroman.xml b/sql/share/charsets/macroman.xml
index 8c8a9070084..ffedaa88274 100644
--- a/sql/share/charsets/macroman.xml
+++ b/sql/share/charsets/macroman.xml
@@ -90,7 +90,7 @@
</map>
</unicode>
-<collation name="macroman">
+<collation name="macroman_general_ci">
<map>
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
diff --git a/sql/sql_class.h b/sql/sql_class.h
index 1d4dafb997e..5e316267e1e 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -378,10 +378,10 @@ struct system_variables
my_bool log_warnings;
my_bool low_priority_updates;
my_bool new_mode;
- my_bool convert_result_charset;
-
+
CHARSET_INFO *client_collation;
CHARSET_INFO *literal_collation;
+ CHARSET_INFO *result_collation;
};
void free_tmp_table(THD *thd, TABLE *entry);
@@ -663,8 +663,6 @@ public:
DBUG_PRINT("error",("Fatal error set"));
}
inline CHARSET_INFO *charset() { return variables.client_collation; }
- inline CHARSET_INFO *result_charset(CHARSET_INFO *cs)
- { return variables.convert_result_charset ? charset() : cs; }
};
/*
diff --git a/sql/sql_db.cc b/sql/sql_db.cc
index 903fcce6350..fe8a945bff8 100644
--- a/sql/sql_db.cc
+++ b/sql/sql_db.cc
@@ -602,7 +602,6 @@ bool mysql_change_db(THD *thd, const char *name)
strmov(path+unpack_dirname(path,path), MY_DB_OPT_FILE);
load_db_opt(path, &create);
thd->db_charset= create.table_charset ? create.table_charset : default_charset_info;
- thd->variables.client_collation=thd->db_charset ? thd->db_charset : default_charset_info;
DBUG_RETURN(0);
}
diff --git a/sql/sql_union.cc b/sql/sql_union.cc
index 4cf1849de3c..0233d1b4822 100644
--- a/sql/sql_union.cc
+++ b/sql/sql_union.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000 MySQL AB
+/* Copyright (C) 2000-2003 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -68,6 +68,7 @@ int select_union::prepare(List<Item> &list, SELECT_LEX_UNIT *u)
return 0;
}
+
bool select_union::send_data(List<Item> &values)
{
if (unit->offset_limit_cnt)
@@ -91,11 +92,13 @@ bool select_union::send_data(List<Item> &values)
return 0;
}
+
bool select_union::send_eof()
{
return 0;
}
+
bool select_union::flush()
{
int error;
@@ -108,9 +111,13 @@ bool select_union::flush()
return 0;
}
-int st_select_lex_unit::prepare(THD *thd, select_result *result,
+
+int st_select_lex_unit::prepare(THD *thd, select_result *sel_result,
bool tables_and_fields_initied)
{
+ SELECT_LEX_NODE *lex_select_save= thd->lex.current_select;
+ SELECT_LEX *select_cursor;
+ TMP_TABLE_PARAM tmp_table_param;
DBUG_ENTER("st_select_lex_unit::prepare");
if (prepared)
@@ -119,10 +126,8 @@ int st_select_lex_unit::prepare(THD *thd, select_result *result,
res= 0;
found_rows_for_union= 0;
TMP_TABLE_PARAM *tmp_table_param= (TMP_TABLE_PARAM *)sql_calloc(sizeof(TMP_TABLE_PARAM));
- this->result= result;
+ result= sel_result;
t_and_f= tables_and_fields_initied;
- SELECT_LEX_NODE *lex_select_save= thd->lex.current_select;
- SELECT_LEX *select_cursor;
thd->lex.current_select= select_cursor= first_select_in_union();
/* Global option */
@@ -144,7 +149,8 @@ int st_select_lex_unit::prepare(THD *thd, select_result *result,
TABLE_LIST *first_table= (TABLE_LIST*) select_cursor->table_list.first;
if (setup_tables(first_table) ||
- setup_wild(thd, first_table, select_cursor->item_list, 0, select_cursor->with_wild))
+ setup_wild(thd, first_table, select_cursor->item_list, 0,
+ select_cursor->with_wild))
goto err;
List_iterator<Item> it(select_cursor->item_list);
Item *item;
@@ -156,8 +162,8 @@ int st_select_lex_unit::prepare(THD *thd, select_result *result,
(item_list.elements + select_cursor->with_sum_func +
select_cursor->order_list.elements +
select_cursor->group_list.elements)) ||
- setup_fields(thd, select_cursor->ref_pointer_array, first_table, item_list,
- 0, 0, 1))
+ setup_fields(thd, select_cursor->ref_pointer_array, first_table,
+ item_list, 0, 0, 1))
goto err;
t_and_f= 1;
}
@@ -182,11 +188,11 @@ int st_select_lex_unit::prepare(THD *thd, select_result *result,
union_result->not_describe=1;
union_result->tmp_table_param=tmp_table_param;
-/*
- the following piece of code is placed here solely for the purpose of
- getting correct results with EXPLAIN when UNION is withing a sub-select
- or derived table ...
-*/
+ /*
+ The following piece of code is placed here solely for the purpose of
+ getting correct results with EXPLAIN when UNION is withing a sub-select
+ or derived table ...
+ */
if (thd->lex.describe)
{
@@ -215,7 +221,7 @@ int st_select_lex_unit::prepare(THD *thd, select_result *result,
(ORDER*) NULL,
sl, this, t_and_f);
t_and_f= 0;
- if (res | thd->is_fatal_error)
+ if (res || thd->is_fatal_error)
goto err;
}
}
@@ -234,7 +240,7 @@ int st_select_lex_unit::prepare(THD *thd, select_result *result,
}
}
- DBUG_RETURN(res | thd->is_fatal_error);
+ DBUG_RETURN(res || thd->is_fatal_error ? 1 : 0);
err:
thd->lex.current_select= lex_select_save;
DBUG_RETURN(-1);
@@ -243,17 +249,18 @@ err:
int st_select_lex_unit::exec()
{
- DBUG_ENTER("st_select_lex_unit::exec");
+ int do_print_slow= 0;
SELECT_LEX_NODE *lex_select_save= thd->lex.current_select;
SELECT_LEX *select_cursor=first_select_in_union(), *last_select;
+ DBUG_ENTER("st_select_lex_unit::exec");
+
LINT_INIT(last_select);
- bool do_print_slow=0;
if (executed && !(dependent || uncacheable))
DBUG_RETURN(0);
executed= 1;
- if ((dependent||uncacheable) || !item || !item->assigned())
+ if ((dependent || uncacheable) || !item || !item->assigned())
{
if (optimized && item && item->assigned())
{
@@ -313,7 +320,7 @@ int st_select_lex_unit::exec()
thd->lex.current_select= lex_select_save;
DBUG_RETURN(res);
}
- do_print_slow = do_print_slow || (select_cursor->options & (QUERY_NO_INDEX_USED | QUERY_NO_GOOD_INDEX_USED));
+ do_print_slow|= select_cursor->options;
}
}
optimized= 1;
@@ -321,8 +328,8 @@ int st_select_lex_unit::exec()
/* Send result to 'result' */
// to correct ORDER BY reference resolving
- thd->lex.current_select = select_cursor;
- res =-1;
+ thd->lex.current_select= select_cursor;
+ res= -1;
{
List<Item_func_match> empty_list;
empty_list.empty();
@@ -331,9 +338,11 @@ int st_select_lex_unit::exec()
{
SELECT_LEX *fake_select = new SELECT_LEX();
fake_select->make_empty_select(last_select);
- offset_limit_cnt= (select_cursor->braces) ? global_parameters->offset_limit : 0;
- select_limit_cnt= (select_cursor->braces) ? global_parameters->select_limit+
- global_parameters->offset_limit : HA_POS_ERROR;
+ offset_limit_cnt= (select_cursor->braces ?
+ global_parameters->offset_limit : 0);
+ select_limit_cnt= (select_cursor->braces ?
+ global_parameters->select_limit+
+ global_parameters->offset_limit : HA_POS_ERROR);
if (select_limit_cnt < global_parameters->select_limit)
select_limit_cnt= HA_POS_ERROR; // no limit
if (select_limit_cnt == HA_POS_ERROR)
@@ -350,14 +359,23 @@ int st_select_lex_unit::exec()
thd->limit_found_rows = (ulonglong)table->file->records;
fake_select->exclude();
delete fake_select;
- if (select_cursor == &thd->lex.select_lex && !do_print_slow)
- select_cursor->options &= ~(QUERY_NO_INDEX_USED | QUERY_NO_GOOD_INDEX_USED);
+ /*
+ Mark for slow query log if any of the union parts didn't use
+ indexes efficiently
+ */
+ select_cursor->options= ((select_cursor->options &
+ ~(QUERY_NO_INDEX_USED |
+ QUERY_NO_GOOD_INDEX_USED)) |
+ do_print_slow &
+ (QUERY_NO_INDEX_USED |
+ QUERY_NO_GOOD_INDEX_USED));
}
}
thd->lex.current_select= lex_select_save;
DBUG_RETURN(res);
}
+
int st_select_lex_unit::cleanup()
{
int error= 0;
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index a8c02bf86f2..189a28aea51 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -563,7 +563,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
%type <lex_str>
IDENT TEXT_STRING REAL_NUM FLOAT_NUM NUM LONG_NUM HEX_NUM LEX_HOSTNAME
ULONGLONG_NUM field_ident select_alias ident ident_or_text
- UNDERSCORE_CHARSET IDENT_sys TEXT_STRING_sys TEXT_STRING_db
+ UNDERSCORE_CHARSET IDENT_sys TEXT_STRING_sys TEXT_STRING_literal
NCHAR_STRING
%type <lex_str_ptr>
@@ -2279,9 +2279,9 @@ simple_expr:
Lex->uncacheable();;
}
| ENCRYPT '(' expr ',' expr ')' { $$= new Item_func_encrypt($3,$5); }
- | DECODE_SYM '(' expr ',' TEXT_STRING_db ')'
+ | DECODE_SYM '(' expr ',' TEXT_STRING_literal ')'
{ $$= new Item_func_decode($3,$5.str); }
- | ENCODE_SYM '(' expr ',' TEXT_STRING_db ')'
+ | ENCODE_SYM '(' expr ',' TEXT_STRING_literal ')'
{ $$= new Item_func_encode($3,$5.str); }
| DES_DECRYPT_SYM '(' expr ')'
{ $$= new Item_func_des_decrypt($3); }
@@ -2910,7 +2910,7 @@ having_clause:
;
opt_escape:
- ESCAPE_SYM TEXT_STRING_db { $$= $2.str; }
+ ESCAPE_SYM TEXT_STRING_literal { $$= $2.str; }
| /* empty */ { $$= (char*) "\\"; };
@@ -3921,24 +3921,22 @@ opt_ignore_lines:
/* Common definitions */
text_literal:
- TEXT_STRING_db
+ TEXT_STRING_literal
{
THD *thd= YYTHD;
- CHARSET_INFO *cs= my_charset_same(thd->charset(),thd->db_charset) ?
- thd->charset() : thd->db_charset;
- $$ = new Item_string($1.str,$1.length,cs);
+ $$ = new Item_string($1.str,$1.length,thd->variables.literal_collation);
}
| NCHAR_STRING
{ $$= new Item_string($1.str,$1.length,national_charset_info); }
| UNDERSCORE_CHARSET TEXT_STRING
{ $$ = new Item_string($2.str,$2.length,Lex->charset); }
- | text_literal TEXT_STRING_db
+ | text_literal TEXT_STRING_literal
{ ((Item_string*) $1)->append($2.str,$2.length); }
;
text_string:
- TEXT_STRING_db
- { $$= new String($1.str,$1.length,YYTHD->db_charset); }
+ TEXT_STRING_literal
+ { $$= new String($1.str,$1.length,YYTHD->variables.literal_collation); }
| HEX_NUM
{
Item *tmp = new Item_varbinary($1.str,$1.length);
@@ -4104,18 +4102,18 @@ TEXT_STRING_sys:
}
;
-TEXT_STRING_db:
+TEXT_STRING_literal:
TEXT_STRING
{
THD *thd= YYTHD;
- if (my_charset_same(thd->charset(),thd->db_charset))
+ if (my_charset_same(thd->charset(),thd->variables.literal_collation))
{
$$=$1;
}
else
{
String ident;
- ident.copy($1.str,$1.length,thd->charset(),thd->db_charset);
+ ident.copy($1.str,$1.length,thd->charset(),thd->variables.literal_collation);
$$.str= thd->strmake(ident.ptr(),ident.length());
$$.length= ident.length();
}
@@ -4403,15 +4401,32 @@ option_value:
find_sys_var("tx_isolation"),
new Item_int((int32) $4)));
}
- | charset old_or_new_charset_name_or_default
+ | charset old_or_new_charset_name_or_default opt_collate
{
+ THD *thd= YYTHD;
LEX *lex= Lex;
- lex->var_list.push_back(new set_var_client_collation($2,NULL,1));
+ $2= $2 ? $2: global_system_variables.client_collation;
+ $3= $3 ? $3 : $2;
+ if (!my_charset_same($2,$3))
+ {
+ net_printf(YYTHD,ER_COLLATION_CHARSET_MISMATCH,
+ $3->name,$2->csname);
+ YYABORT;
+ }
+ lex->var_list.push_back(new set_var_client_collation($3,thd->db_charset,$3));
}
| NAMES_SYM charset_name_or_default opt_collate
{
LEX *lex= Lex;
- lex->var_list.push_back(new set_var_client_collation($2,$3,1));
+ $2= $2 ? $2 : global_system_variables.client_collation;
+ $3= $3 ? $3 : $2;
+ if (!my_charset_same($2,$3))
+ {
+ net_printf(YYTHD,ER_COLLATION_CHARSET_MISMATCH,
+ $3->name,$2->csname);
+ YYABORT;
+ }
+ lex->var_list.push_back(new set_var_client_collation($3,$3,$3));
}
| PASSWORD equal text_or_password
{
diff --git a/strings/ctype-big5.c b/strings/ctype-big5.c
index 7be631bbe05..57ee2d7c6ae 100644
--- a/strings/ctype-big5.c
+++ b/strings/ctype-big5.c
@@ -6231,7 +6231,7 @@ CHARSET_INFO my_charset_big5 =
1,0,0, /* number */
MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM, /* state */
"big5", /* cs name */
- "big5", /* name */
+ "big5_chinese_ci", /* name */
"", /* comment */
ctype_big5,
to_lower_big5,
diff --git a/strings/ctype-euc_kr.c b/strings/ctype-euc_kr.c
index 0766cd40040..21f01b6509c 100644
--- a/strings/ctype-euc_kr.c
+++ b/strings/ctype-euc_kr.c
@@ -8639,7 +8639,7 @@ CHARSET_INFO my_charset_euc_kr =
19,0,0, /* number */
MY_CS_COMPILED|MY_CS_PRIMARY, /* state */
"euckr", /* cs name */
- "euckr", /* name */
+ "euckr_korean_ci", /* name */
"", /* comment */
ctype_euc_kr,
to_lower_euc_kr,
diff --git a/strings/ctype-gb2312.c b/strings/ctype-gb2312.c
index ec495be5e84..f1ec5a9f363 100644
--- a/strings/ctype-gb2312.c
+++ b/strings/ctype-gb2312.c
@@ -5689,7 +5689,7 @@ CHARSET_INFO my_charset_gb2312 =
24,0,0, /* number */
MY_CS_COMPILED|MY_CS_PRIMARY, /* state */
"gb2312", /* cs name */
- "gb2312", /* name */
+ "gb2312_chinese_ci",/* name */
"", /* comment */
ctype_gb2312,
to_lower_gb2312,
diff --git a/strings/ctype-gbk.c b/strings/ctype-gbk.c
index 7673f4e6c23..b1ea209d6ad 100644
--- a/strings/ctype-gbk.c
+++ b/strings/ctype-gbk.c
@@ -9886,7 +9886,7 @@ CHARSET_INFO my_charset_gbk =
28,0,0, /* number */
MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM, /* state */
"gbk", /* cs name */
- "gbk", /* name */
+ "gbk_chinese_ci", /* name */
"", /* comment */
ctype_gbk,
to_lower_gbk,
diff --git a/strings/ctype-sjis.c b/strings/ctype-sjis.c
index b2b1a40bdcc..fd911f1867e 100644
--- a/strings/ctype-sjis.c
+++ b/strings/ctype-sjis.c
@@ -4473,7 +4473,7 @@ CHARSET_INFO my_charset_sjis =
13,0,0, /* number */
MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM, /* state */
"sjis", /* cs name */
- "sjis", /* name */
+ "sjis_japanese_ci", /* name */
"", /* comment */
ctype_sjis,
to_lower_sjis,
diff --git a/strings/ctype-tis620.c b/strings/ctype-tis620.c
index 9da7b02ed31..21722f317a1 100644
--- a/strings/ctype-tis620.c
+++ b/strings/ctype-tis620.c
@@ -701,7 +701,7 @@ CHARSET_INFO my_charset_tis620 =
18,0,0, /* number */
MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM, /* state */
"tis620", /* cs name */
- "tis620", /* name */
+ "tis620_thai_ci", /* name */
"", /* comment */
ctype_tis620,
to_lower_tis620,
diff --git a/strings/ctype-ujis.c b/strings/ctype-ujis.c
index de73608293c..92214868018 100644
--- a/strings/ctype-ujis.c
+++ b/strings/ctype-ujis.c
@@ -8430,7 +8430,7 @@ CHARSET_INFO my_charset_ujis =
12,0,0, /* number */
MY_CS_COMPILED|MY_CS_PRIMARY, /* state */
"ujis", /* cs name */
- "ujis", /* name */
+ "ujis_japanese_ci", /* name */
"", /* comment */
ctype_ujis,
to_lower_ujis,
diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c
index 69500f6d3d6..4c908014994 100644
--- a/strings/ctype-utf8.c
+++ b/strings/ctype-utf8.c
@@ -1955,7 +1955,7 @@ CHARSET_INFO my_charset_utf8 =
33,0,0, /* number */
MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM, /* state */
"utf8", /* cs name */
- "utf8", /* name */
+ "utf8_general_ci", /* name */
"", /* comment */
ctype_utf8, /* ctype */
to_lower_utf8, /* to_lower */
@@ -3030,7 +3030,7 @@ CHARSET_INFO my_charset_ucs2 =
35,0,0, /* number */
MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM, /* state */
"ucs2", /* cs name */
- "ucs2", /* name */
+ "ucs2_general_ci", /* name */
"", /* comment */
ctype_ucs2, /* ctype */
to_lower_ucs2, /* to_lower */