diff options
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 */ |