Commit a6adc383 authored by unknown's avatar unknown

Merge sinisa@bk-internal.mysql.com:/home/bk/mysql-4.1

into sinisa.nasamreza.org:/mnt/work/mysql-4.1


sql/item.cc:
  Auto merged
parents c3cc7b98 ba5065b8
...@@ -203,7 +203,6 @@ extern int (*fatal_error_handler_hook)(uint my_err, const char *str, ...@@ -203,7 +203,6 @@ extern int (*fatal_error_handler_hook)(uint my_err, const char *str,
/* charsets */ /* charsets */
extern CHARSET_INFO *default_charset_info; extern CHARSET_INFO *default_charset_info;
extern CHARSET_INFO *system_charset_info;
extern CHARSET_INFO *all_charsets[256]; extern CHARSET_INFO *all_charsets[256];
extern CHARSET_INFO compiled_charsets[]; extern CHARSET_INFO compiled_charsets[];
......
...@@ -294,10 +294,10 @@ ha_print_info( ...@@ -294,10 +294,10 @@ ha_print_info(
{ {
hash_cell_t* cell; hash_cell_t* cell;
/* ha_node_t* node; */ /* ha_node_t* node; */
ulint nodes = 0; /* ulint nodes = 0; */
ulint cells = 0; ulint cells = 0;
ulint len = 0; /* ulint len = 0; */
ulint max_len = 0; /* ulint max_len = 0; */
ulint n_bufs; ulint n_bufs;
ulint i; ulint i;
......
...@@ -262,7 +262,7 @@ show create table t1; ...@@ -262,7 +262,7 @@ show create table t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL default '0' `a` int(11) NOT NULL default '0'
) TYPE=HEAP ) TYPE=HEAP CHARSET=latin1
drop table t1; drop table t1;
SET SESSION table_type="gemini"; SET SESSION table_type="gemini";
SELECT @@table_type; SELECT @@table_type;
...@@ -273,6 +273,6 @@ show create table t1; ...@@ -273,6 +273,6 @@ show create table t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL default '0' `a` int(11) NOT NULL default '0'
) TYPE=MyISAM ) TYPE=MyISAM CHARSET=latin1
SET SESSION table_type=default; SET SESSION table_type=default;
drop table t1; drop table t1;
...@@ -140,13 +140,13 @@ id parent_id level ...@@ -140,13 +140,13 @@ id parent_id level
1015 102 2 1015 102 2
explain select level from t1 where level=1; explain select level from t1 where level=1;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ref level level 1 const 12 Using where; Using index 1 SIMPLE t1 ref level level 1 const # Using where; Using index
explain select level,id from t1 where level=1; explain select level,id from t1 where level=1;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ref level level 1 const 12 Using where; Using index 1 SIMPLE t1 ref level level 1 const # Using where; Using index
explain select level,id,parent_id from t1 where level=1; explain select level,id,parent_id from t1 where level=1;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ref level level 1 const 12 Using where 1 SIMPLE t1 ref level level 1 const # Using where
select level,id from t1 where level=1; select level,id from t1 where level=1;
level id level id
1 1002 1 1002
...@@ -168,9 +168,9 @@ Table Op Msg_type Msg_text ...@@ -168,9 +168,9 @@ Table Op Msg_type Msg_text
test.t1 optimize error The handler for the table doesn't support optimize test.t1 optimize error The handler for the table doesn't support optimize
show keys from t1; show keys from t1;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
t1 0 PRIMARY 1 id A 87 NULL NULL BTREE t1 0 PRIMARY 1 id A # NULL NULL BTREE
t1 1 parent_id 1 parent_id A 43 NULL NULL BTREE t1 1 parent_id 1 parent_id A # NULL NULL BTREE
t1 1 level 1 level A 6 NULL NULL BTREE t1 1 level 1 level A # NULL NULL BTREE
drop table t1; drop table t1;
CREATE TABLE t1 ( CREATE TABLE t1 (
gesuchnr int(11) DEFAULT '0' NOT NULL, gesuchnr int(11) DEFAULT '0' NOT NULL,
......
slave stop; stop slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
reset master; reset master;
reset slave; reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
slave start; start slave;
stop slave; stop slave;
create table t1 (a int); create table t1 (a int);
reset slave; reset slave;
......
...@@ -22,6 +22,8 @@ drop table t1; ...@@ -22,6 +22,8 @@ drop table t1;
# #
# A bit bigger test # A bit bigger test
# The 'replace_result' statements are needed because the cardinality calculated
# by innodb is not always the same between runs
# #
CREATE TABLE t1 ( CREATE TABLE t1 (
...@@ -43,12 +45,16 @@ update ignore t1 set id=id+1; # This will change all rows ...@@ -43,12 +45,16 @@ update ignore t1 set id=id+1; # This will change all rows
select * from t1; select * from t1;
update ignore t1 set id=1023 where id=1010; update ignore t1 set id=1023 where id=1010;
select * from t1 where parent_id=102; select * from t1 where parent_id=102;
--replace_result 12 # 6 #
explain select level from t1 where level=1; explain select level from t1 where level=1;
--replace_result 12 # 6 #
explain select level,id from t1 where level=1; explain select level,id from t1 where level=1;
--replace_result 12 # 6 # 5 #
explain select level,id,parent_id from t1 where level=1; explain select level,id,parent_id from t1 where level=1;
select level,id from t1 where level=1; select level,id from t1 where level=1;
select level,id,parent_id from t1 where level=1; select level,id,parent_id from t1 where level=1;
optimize table t1; optimize table t1;
--replace_result 87 # 50 # 48 # 43 # 25 # 24 # 6 # 3 #
show keys from t1; show keys from t1;
drop table t1; drop table t1;
......
...@@ -58,10 +58,9 @@ EXTRA_SCRIPTS = make_binary_distribution.sh \ ...@@ -58,10 +58,9 @@ EXTRA_SCRIPTS = make_binary_distribution.sh \
EXTRA_DIST = $(EXTRA_SCRIPTS) \ EXTRA_DIST = $(EXTRA_SCRIPTS) \
mysqlaccess.conf \ mysqlaccess.conf \
mysqlbug \ mysqlbug
fill_help_tables.sql
pkgdata_DATA = make_binary_distribution pkgdata_DATA = fill_help_tables.sql
# mysqlbug should be distributed built so that people can report build # mysqlbug should be distributed built so that people can report build
# failures with it. # failures with it.
...@@ -81,8 +80,8 @@ CLEANFILES = @server_scripts@ \ ...@@ -81,8 +80,8 @@ CLEANFILES = @server_scripts@ \
mysqlhotcopy \ mysqlhotcopy \
mysqldumpslow \ mysqldumpslow \
mysqld_multi \ mysqld_multi \
fill_help_tables \ fill_help_tables \
fill_help_tables.sql fill_help_tables.sql
SUPERCLEANFILES = mysqlbug SUPERCLEANFILES = mysqlbug
...@@ -103,6 +102,7 @@ SUFFIXES = .sh ...@@ -103,6 +102,7 @@ SUFFIXES = .sh
-e 's!@''libexecdir''@!$(libexecdir)!g' \ -e 's!@''libexecdir''@!$(libexecdir)!g' \
-e 's!@''pkglibdir''@!$(pkglibdir)!g' \ -e 's!@''pkglibdir''@!$(pkglibdir)!g' \
-e 's!@''pkgincludedir''@!$(pkgincludedir)!g' \ -e 's!@''pkgincludedir''@!$(pkgincludedir)!g' \
-e 's!@''pkgdatadir''@!$(pkgdatadir)!g' \
-e 's!@''CC''@!@CC@!'\ -e 's!@''CC''@!@CC@!'\
-e 's!@''CXX''@!@CXX@!'\ -e 's!@''CXX''@!@CXX@!'\
-e 's!@''GXX''@!@GXX@!'\ -e 's!@''GXX''@!@GXX@!'\
...@@ -137,7 +137,12 @@ SUFFIXES = .sh ...@@ -137,7 +137,12 @@ SUFFIXES = .sh
# Don't update the files from bitkeeper # Don't update the files from bitkeeper
%::SCCS/s.% %::SCCS/s.%
all: fill_help_tables.sql make_win_src_distribution all: fill_help_tables.sql make_win_src_distribution make_binary_distribution
# The following rule is here to ensure that build will continue
# even if we don't have perl installed. In this case the help tables
# will be empty
fill_help_tables.sql: fill_help_tables ../Docs/manual.texi fill_help_tables.sql: fill_help_tables ../Docs/manual.texi
./fill_help_tables < ../Docs/manual.texi > fill_help_tables.sql -./fill_help_tables < ../Docs/manual.texi > fill_help_tables.sql
echo "" >> fill_help_tables.sql
...@@ -111,12 +111,12 @@ sub flush_all ...@@ -111,12 +111,12 @@ sub flush_all
$example= prepare_example($example); $example= prepare_example($example);
if ($func_name ne "" && $text ne "" && !($func_name =~ /[abcdefghikjlmnopqrstuvwxyz]/)){ if ($func_name ne "" && $text ne "" && !($func_name =~ /[abcdefghikjlmnopqrstuvwxyz]/)){
print "INSERT INTO help_topic (name,description,example) VALUES ("; print "INSERT IGNORE INTO help_topic (name,description,example) VALUES (";
print "'$func_name',"; print "'$func_name',";
print "'$text',"; print "'$text',";
print "'$example'"; print "'$example'";
print ");\n"; print ");\n";
print "INSERT INTO help_relation (help_category_id,help_topic_id) VALUES (\@cur_category,LAST_INSERT_ID());\n"; print "INSERT IGNORE INTO help_relation (help_category_id,help_topic_id) VALUES (\@cur_category,LAST_INSERT_ID());\n";
} }
$func_name= ""; $func_name= "";
...@@ -131,11 +131,11 @@ sub new_category ...@@ -131,11 +131,11 @@ sub new_category
$category= prepare_text($category); $category= prepare_text($category);
print "INSERT INTO help_category (name) VALUES (\'$category\');\n"; print "INSERT IGNORE INTO help_category (name) VALUES (\'$category\');\n";
print "SET \@cur_category=LAST_INSERT_ID();\n"; print "SET \@cur_category=LAST_INSERT_ID();\n";
} }
#print "INSERT INTO db (Host,DB,User,Select_priv) VALUES ('%','mysql_help','','Y');\n"; #print "INSERT IGNORE INTO db (Host,DB,User,Select_priv) VALUES ('%','mysql_help','','Y');\n";
#print "CREATE DATABASE mysql_help;\n"; #print "CREATE DATABASE mysql_help;\n";
print "USE mysql;\n"; print "USE mysql;\n";
...@@ -236,4 +236,3 @@ print "DELETE help_category "; ...@@ -236,4 +236,3 @@ print "DELETE help_category ";
print "FROM help_category "; print "FROM help_category ";
print "LEFT JOIN help_relation ON help_category.help_category_id=help_relation.help_category_id "; print "LEFT JOIN help_relation ON help_category.help_category_id=help_relation.help_category_id ";
print "WHERE help_relation.help_category_id is null;" print "WHERE help_relation.help_category_id is null;"
...@@ -160,6 +160,7 @@ if [ $BASE_SYSTEM != "netware" ] ; then ...@@ -160,6 +160,7 @@ if [ $BASE_SYSTEM != "netware" ] ; then
fi fi
$CP support-files/* $BASE/support-files $CP support-files/* $BASE/support-files
$CP scripts/fill_help_tables.sql $BASE/support-files
if [ $BASE_SYSTEM = "netware" ] ; then if [ $BASE_SYSTEM = "netware" ] ; then
rm -f $BASE/support-files/magic \ rm -f $BASE/support-files/magic \
...@@ -183,14 +184,14 @@ do ...@@ -183,14 +184,14 @@ do
done done
$CP mysql-test/include/*.inc $BASE/mysql-test/include $CP mysql-test/include/*.inc $BASE/mysql-test/include
$CP mysql-test/std_data/*.dat mysql-test/std_data/*.001 $BASE/mysql-test/std_data $CP mysql-test/std_data/*.dat mysql-test/std_data/*.*001 $BASE/mysql-test/std_data
$CP mysql-test/std_data/des_key_file $BASE/mysql-test/std_data $CP mysql-test/std_data/des_key_file $BASE/mysql-test/std_data
$CP mysql-test/t/*test mysql-test/t/*.opt mysql-test/t/*.slave-mi mysql-test/t/*.sh $BASE/mysql-test/t $CP mysql-test/t/*test mysql-test/t/*.opt mysql-test/t/*.slave-mi mysql-test/t/*.sh $BASE/mysql-test/t
$CP mysql-test/r/*result mysql-test/r/*.require $BASE/mysql-test/r $CP mysql-test/r/*result mysql-test/r/*.require $BASE/mysql-test/r
if [ $BASE_SYSTEM != "netware" ] ; then if [ $BASE_SYSTEM != "netware" ] ; then
$CP scripts/* $BASE/bin $CP scripts/* $BASE/bin
$BASE/bin/replace \@localstatedir\@ ./data \@bindir\@ ./bin \@scriptdir\@ ./bin \@libexecdir\@ ./bin \@sbindir\@ ./bin \@prefix\@ . \@HOSTNAME\@ @HOSTNAME@ < $SOURCE/scripts/mysql_install_db.sh > $BASE/scripts/mysql_install_db $BASE/bin/replace \@localstatedir\@ ./data \@bindir\@ ./bin \@scriptdir\@ ./bin \@libexecdir\@ ./bin \@sbindir\@ ./bin \@prefix\@ . \@HOSTNAME\@ @HOSTNAME@ \@pkgdatadir\@ ./support-files < $SOURCE/scripts/mysql_install_db.sh > $BASE/scripts/mysql_install_db
$BASE/bin/replace \@prefix\@ /usr/local/mysql \@bindir\@ ./bin \@MYSQLD_USER\@ root \@localstatedir\@ /usr/local/mysql/data \@HOSTNAME\@ @HOSTNAME@ < $SOURCE/support-files/mysql.server.sh > $BASE/support-files/mysql.server $BASE/bin/replace \@prefix\@ /usr/local/mysql \@bindir\@ ./bin \@MYSQLD_USER\@ root \@localstatedir\@ /usr/local/mysql/data \@HOSTNAME\@ @HOSTNAME@ < $SOURCE/support-files/mysql.server.sh > $BASE/support-files/mysql.server
$BASE/bin/replace /my/gnu/bin/hostname /bin/hostname -- $BASE/bin/mysqld_safe $BASE/bin/replace /my/gnu/bin/hostname /bin/hostname -- $BASE/bin/mysqld_safe
mv $BASE/support-files/binary-configure $BASE/configure mv $BASE/support-files/binary-configure $BASE/configure
......
#!/bin/sh #!/bin/sh
# Copyright (C) 2002 MySQL AB # Copyright (C) 2002-2003 MySQL AB
# For a more info consult the file COPYRIGHT distributed with this file. # For a more info consult the file COPYRIGHT distributed with this file.
# This scripts creates the privilege tables db, host, user, tables_priv, # This scripts creates the privilege tables db, host, user, tables_priv,
...@@ -43,6 +43,7 @@ parse_arguments() { ...@@ -43,6 +43,7 @@ parse_arguments() {
--basedir=*) basedir=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; --basedir=*) basedir=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
--ldata=*|--datadir=*) ldata=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; --ldata=*|--datadir=*) ldata=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
--user=*) user=`echo "$arg" | sed -e 's/^[^=]*=//'` ;; --user=*) user=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
--verbose) verbose=1 ;;
*) *)
if test -n "$pick_args" if test -n "$pick_args"
then then
...@@ -76,6 +77,8 @@ execdir= ...@@ -76,6 +77,8 @@ execdir=
bindir= bindir=
basedir= basedir=
force=0 force=0
verbose=0
fill_help_tables=""
parse_arguments `$print_defaults $defaults mysqld mysql_install_db` parse_arguments `$print_defaults $defaults mysqld mysql_install_db`
parse_arguments PICK-ARGS-FROM-ARGV "$@" parse_arguments PICK-ARGS-FROM-ARGV "$@"
...@@ -85,17 +88,37 @@ then ...@@ -85,17 +88,37 @@ then
basedir=@prefix@ basedir=@prefix@
bindir=@bindir@ bindir=@bindir@
execdir=@libexecdir@ execdir=@libexecdir@
pkgdatadir=@pkgdatadir@
else else
bindir="$basedir/bin" bindir="$basedir/bin"
if test -x "$basedir/libexec/mysqld" if test -x "$basedir/libexec/mysqld"
then then
execdir="$basedir/libexec" execdir="$basedir/libexec"
elif test -x "@libexecdir@/mysqld" elif test -x "@libexecdir@/mysqld"
then
execdir="@libexecdir@"
else
execdir="$basedir/bin"
fi
# find fill_help_tables.sh
for i in $basedir/support-files $basedir/share $basedir/share/mysql $basedir/scripts @pkgdatadir@
do
if test -f $i/fill_help_tables.sql
then
pkgdatadir=$i
fi
done
fi
if test -f $pkgdatadir/fill_help_tables.sql
then then
execdir="@libexecdir@" fill_help_tables=$pkgdatadir/fill_help_tables.sql
else else
execdir="$basedir/bin" if test $verbose -eq 1
fi then
echo "Could not find help file 'fill_help_tables.sql'".
fi
fi fi
mdata=$ldata/mysql mdata=$ldata/mysql
...@@ -160,8 +183,9 @@ c_t="" c_c="" ...@@ -160,8 +183,9 @@ c_t="" c_c=""
# Check for old tables # Check for old tables
if test ! -f $mdata/db.frm if test ! -f $mdata/db.frm
then then
echo "Preparing db table" if test $verbose -eq 1 ; then
echo "Preparing db table"
fi
# mysqld --bootstrap wants one command/line # mysqld --bootstrap wants one command/line
c_d="$c_d CREATE TABLE db (" c_d="$c_d CREATE TABLE db ("
c_d="$c_d Host char(60) binary DEFAULT '' NOT NULL," c_d="$c_d Host char(60) binary DEFAULT '' NOT NULL,"
...@@ -190,7 +214,9 @@ fi ...@@ -190,7 +214,9 @@ fi
if test ! -f $mdata/host.frm if test ! -f $mdata/host.frm
then then
echo "Preparing host table" if test $verbose -eq 1 ; then
echo "Preparing host table"
fi
c_h="$c_h CREATE TABLE host (" c_h="$c_h CREATE TABLE host ("
c_h="$c_h Host char(60) binary DEFAULT '' NOT NULL," c_h="$c_h Host char(60) binary DEFAULT '' NOT NULL,"
...@@ -214,7 +240,9 @@ fi ...@@ -214,7 +240,9 @@ fi
if test ! -f $mdata/user.frm if test ! -f $mdata/user.frm
then then
echo "Preparing user table" if test $verbose -eq 1 ; then
echo "Preparing user table"
fi
c_u="$c_u CREATE TABLE user (" c_u="$c_u CREATE TABLE user ("
c_u="$c_u Host char(60) binary DEFAULT '' NOT NULL," c_u="$c_u Host char(60) binary DEFAULT '' NOT NULL,"
...@@ -256,7 +284,8 @@ then ...@@ -256,7 +284,8 @@ then
REPLACE INTO user VALUES ('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0); REPLACE INTO user VALUES ('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0);
INSERT INTO user (host,user) values ('localhost','');" INSERT INTO user (host,user) values ('localhost','');
"
if test "$windows" -eq 0 if test "$windows" -eq 0
then then
...@@ -270,7 +299,9 @@ fi ...@@ -270,7 +299,9 @@ fi
if test ! -f $mdata/func.frm if test ! -f $mdata/func.frm
then then
echo "Preparing func table" if test $verbose -eq 1 ; then
echo "Preparing func table"
fi
c_f="$c_f CREATE TABLE func (" c_f="$c_f CREATE TABLE func ("
c_f="$c_f name char(64) binary DEFAULT '' NOT NULL," c_f="$c_f name char(64) binary DEFAULT '' NOT NULL,"
...@@ -284,7 +315,9 @@ fi ...@@ -284,7 +315,9 @@ fi
if test ! -f $mdata/tables_priv.frm if test ! -f $mdata/tables_priv.frm
then then
echo "Preparing tables_priv table" if test $verbose -eq 1 ; then
echo "Preparing tables_priv table"
fi
c_t="$c_t CREATE TABLE tables_priv (" c_t="$c_t CREATE TABLE tables_priv ("
c_t="$c_t Host char(60) binary DEFAULT '' NOT NULL," c_t="$c_t Host char(60) binary DEFAULT '' NOT NULL,"
...@@ -303,7 +336,9 @@ fi ...@@ -303,7 +336,9 @@ fi
if test ! -f $mdata/columns_priv.frm if test ! -f $mdata/columns_priv.frm
then then
echo "Preparing columns_priv table" if test $verbose -eq 1 ; then
echo "Preparing columns_priv table"
fi
c_c="$c_c CREATE TABLE columns_priv (" c_c="$c_c CREATE TABLE columns_priv ("
c_c="$c_c Host char(60) binary DEFAULT '' NOT NULL," c_c="$c_c Host char(60) binary DEFAULT '' NOT NULL,"
...@@ -318,7 +353,7 @@ then ...@@ -318,7 +353,7 @@ then
c_c="$c_c comment='Column privileges';" c_c="$c_c comment='Column privileges';"
fi fi
echo "Installing all prepared tables" echo "Installing privilege tables"
if ( if (
cat << END_OF_DATA cat << END_OF_DATA
use mysql; use mysql;
...@@ -337,7 +372,10 @@ $i_f ...@@ -337,7 +372,10 @@ $i_f
$c_t $c_t
$c_c $c_c
END_OF_DATA END_OF_DATA
cat fill_help_tables.sql if test -n "$fill_help_tables"
then
cat $fill_help_tables
fi
) | eval "$execdir/mysqld $defaults --bootstrap --skip-grant-tables \ ) | eval "$execdir/mysqld $defaults --bootstrap --skip-grant-tables \
--basedir=$basedir --datadir=$ldata --skip-innodb --skip-bdb $args" --basedir=$basedir --datadir=$ldata --skip-innodb --skip-bdb $args"
then then
...@@ -377,7 +415,6 @@ then ...@@ -377,7 +415,6 @@ then
echo "The latest information about MySQL is available on the web at" echo "The latest information about MySQL is available on the web at"
echo "http://www.mysql.com" echo "http://www.mysql.com"
echo "Support MySQL by buying support/licenses at https://order.mysql.com" echo "Support MySQL by buying support/licenses at https://order.mysql.com"
echo
exit 0 exit 0
else else
echo "Installation of grant tables failed!" echo "Installation of grant tables failed!"
......
...@@ -1049,7 +1049,8 @@ int ha_myisam::create(const char *name, register TABLE *table_arg, ...@@ -1049,7 +1049,8 @@ int ha_myisam::create(const char *name, register TABLE *table_arg,
&recinfo,(table_arg->fields*2+2)*sizeof(MI_COLUMNDEF), &recinfo,(table_arg->fields*2+2)*sizeof(MI_COLUMNDEF),
&keydef, table_arg->keys*sizeof(MI_KEYDEF), &keydef, table_arg->keys*sizeof(MI_KEYDEF),
&keyseg, &keyseg,
((table_arg->key_parts + table_arg->keys) * sizeof(HA_KEYSEG)), ((table_arg->key_parts + table_arg->keys) *
sizeof(HA_KEYSEG)),
0))) 0)))
DBUG_RETURN(1); DBUG_RETURN(1);
...@@ -1107,7 +1108,8 @@ int ha_myisam::create(const char *name, register TABLE *table_arg, ...@@ -1107,7 +1108,8 @@ int ha_myisam::create(const char *name, register TABLE *table_arg,
keydef[i].seg[j].null_bit=0; keydef[i].seg[j].null_bit=0;
keydef[i].seg[j].null_pos=0; keydef[i].seg[j].null_pos=0;
} }
if ((field->type() == FIELD_TYPE_BLOB) || (field->type() == FIELD_TYPE_GEOMETRY)) if (field->type() == FIELD_TYPE_BLOB ||
field->type() == FIELD_TYPE_GEOMETRY)
{ {
keydef[i].seg[j].flag|=HA_BLOB_PART; keydef[i].seg[j].flag|=HA_BLOB_PART;
/* save number of bytes used to pack length */ /* save number of bytes used to pack length */
......
...@@ -93,20 +93,23 @@ bool Item::check_cols(uint c) ...@@ -93,20 +93,23 @@ bool Item::check_cols(uint c)
void Item::set_name(const char *str,uint length, CHARSET_INFO *cs) void Item::set_name(const char *str,uint length, CHARSET_INFO *cs)
{ {
if (!length) if (!length)
length= str ? strlen(str) : 0; name= (char*) str; // Empty string, used by AS
while (length && !my_isgraph(cs,*str)) else
{ // Fix problem with yacc
length--;
str++;
}
if (!my_charset_same(cs, system_charset_info))
{ {
String tmp; while (length && !my_isgraph(cs,*str))
tmp.copy(str, length, cs, system_charset_info); { // Fix problem with yacc
name=sql_strmake(tmp.ptr(),min(tmp.length(),MAX_FIELD_WIDTH)); length--;
str++;
}
if (length && !my_charset_same(cs, system_charset_info))
{
String tmp;
tmp.copy(str, length, cs, system_charset_info);
name=sql_strmake(tmp.ptr(),min(tmp.length(),MAX_FIELD_WIDTH));
}
else
name=sql_strmake(str,min(length,MAX_FIELD_WIDTH));
} }
else
name=sql_strmake(str,min(length,MAX_FIELD_WIDTH));
} }
/* /*
...@@ -196,10 +199,17 @@ bool Item::set_charset(CHARSET_INFO *cs1, enum coercion co1, ...@@ -196,10 +199,17 @@ bool Item::set_charset(CHARSET_INFO *cs1, enum coercion co1,
{ {
if (cs1 != cs2) if (cs1 != cs2)
{ {
CHARSET_INFO *bin= get_charset_by_csname(cs1->csname, MY_CS_BINSORT,MYF(0)); if (co1 == COER_EXPLICIT)
if (!bin) {
return 1; return 1;
set_charset(bin, COER_NOCOLL); }
else
{
CHARSET_INFO *bin= get_charset_by_csname(cs1->csname, MY_CS_BINSORT,MYF(0));
if (!bin)
return 1;
set_charset(bin, COER_NOCOLL);
}
} }
else else
set_charset(cs2, co2); set_charset(cs2, co2);
...@@ -984,6 +994,7 @@ Item_varbinary::Item_varbinary(const char *str, uint str_length) ...@@ -984,6 +994,7 @@ Item_varbinary::Item_varbinary(const char *str, uint str_length)
str+=2; str+=2;
} }
*ptr=0; // Keep purify happy *ptr=0; // Keep purify happy
coercibility= COER_COERCIBLE;
} }
longlong Item_varbinary::val_int() longlong Item_varbinary::val_int()
......
...@@ -111,7 +111,21 @@ bool Item_bool_func2::set_cmp_charset(CHARSET_INFO *cs1, enum coercion co1, ...@@ -111,7 +111,21 @@ bool Item_bool_func2::set_cmp_charset(CHARSET_INFO *cs1, enum coercion co1,
if (cs1 == cs2) if (cs1 == cs2)
cmp_charset= cs1; cmp_charset= cs1;
else else
return 1; {
if (co1 == COER_COERCIBLE)
{
CHARSET_INFO *c= get_charset_by_csname(cs1->csname,MY_CS_PRIMARY,MYF(0));
if (c)
{
cmp_charset= c;
return 0;
}
else
return 1;
}
else
return 1;
}
} }
return 0; return 0;
} }
...@@ -636,6 +650,9 @@ Item_func_ifnull::fix_length_and_dec() ...@@ -636,6 +650,9 @@ Item_func_ifnull::fix_length_and_dec()
args[1]->result_type())) != args[1]->result_type())) !=
REAL_RESULT) REAL_RESULT)
decimals= 0; decimals= 0;
if (set_charset(args[0]->charset(),args[0]->coercibility,
args[1]->charset(),args[1]->coercibility))
my_error(ER_WRONG_ARGUMENTS,MYF(0),func_name());
} }
...@@ -676,11 +693,13 @@ Item_func_ifnull::val_str(String *str) ...@@ -676,11 +693,13 @@ Item_func_ifnull::val_str(String *str)
if (!args[0]->null_value) if (!args[0]->null_value)
{ {
null_value=0; null_value=0;
res->set_charset(charset());
return res; return res;
} }
res=args[1]->val_str(str); res=args[1]->val_str(str);
if ((null_value=args[1]->null_value)) if ((null_value=args[1]->null_value))
return 0; return 0;
res->set_charset(charset());
return res; return res;
} }
...@@ -709,8 +728,12 @@ Item_func_if::fix_length_and_dec() ...@@ -709,8 +728,12 @@ Item_func_if::fix_length_and_dec()
else if (arg1_type == STRING_RESULT || arg2_type == STRING_RESULT) else if (arg1_type == STRING_RESULT || arg2_type == STRING_RESULT)
{ {
cached_result_type = STRING_RESULT; cached_result_type = STRING_RESULT;
set_charset((args[1]->binary() || args[2]->binary()) ? if (set_charset(args[1]->charset(), args[1]->coercibility,
&my_charset_bin : args[1]->charset()); args[2]->charset(), args[2]->coercibility))
{
my_error(ER_WRONG_ARGUMENTS,MYF(0),func_name());
return;
}
} }
else else
{ {
...@@ -746,6 +769,7 @@ Item_func_if::val_str(String *str) ...@@ -746,6 +769,7 @@ Item_func_if::val_str(String *str)
{ {
Item *arg= args[0]->val_int() ? args[1] : args[2]; Item *arg= args[0]->val_int() ? args[1] : args[2];
String *res=arg->val_str(str); String *res=arg->val_str(str);
res->set_charset(charset());
null_value=arg->null_value; null_value=arg->null_value;
return res; return res;
} }
......
...@@ -475,6 +475,12 @@ Item *create_func_is_free_lock(Item* a) ...@@ -475,6 +475,12 @@ Item *create_func_is_free_lock(Item* a)
return new Item_func_is_free_lock(a); return new Item_func_is_free_lock(a);
} }
Item *create_func_is_used_lock(Item* a)
{
current_thd->lex.uncacheable();
return new Item_func_is_used_lock(a);
}
Item *create_func_quote(Item* a) Item *create_func_quote(Item* a)
{ {
return new Item_func_quote(a); return new Item_func_quote(a);
......
...@@ -100,6 +100,7 @@ Item *create_func_version(void); ...@@ -100,6 +100,7 @@ Item *create_func_version(void);
Item *create_func_weekday(Item* a); Item *create_func_weekday(Item* a);
Item *create_load_file(Item* a); Item *create_load_file(Item* a);
Item *create_func_is_free_lock(Item* a); Item *create_func_is_free_lock(Item* a);
Item *create_func_is_used_lock(Item* a);
Item *create_func_quote(Item* a); Item *create_func_quote(Item* a);
Item *create_func_geometry_from_text(Item *a); Item *create_func_geometry_from_text(Item *a);
......
...@@ -855,9 +855,13 @@ void Item_func_min_max::fix_length_and_dec() ...@@ -855,9 +855,13 @@ void Item_func_min_max::fix_length_and_dec()
maybe_null=0; maybe_null=0;
cmp_type=item_cmp_type(cmp_type,args[i]->result_type()); cmp_type=item_cmp_type(cmp_type,args[i]->result_type());
if (i==0) if (i==0)
set_charset(args[i]->charset()); set_charset(args[i]->charset(), args[i]->coercibility);
else if (args[i]->charset() == &my_charset_bin) else if (set_charset(charset(), coercibility,
set_charset(&my_charset_bin); args[i]->charset(), args[i]->coercibility))
{
my_error(ER_WRONG_ARGUMENTS,MYF(0),func_name());
break;
}
} }
} }
...@@ -909,6 +913,7 @@ String *Item_func_min_max::val_str(String *str) ...@@ -909,6 +913,7 @@ String *Item_func_min_max::val_str(String *str)
} }
} }
} }
res->set_charset(charset());
return res; return res;
} }
case ROW_RESULT: case ROW_RESULT:
...@@ -1610,8 +1615,10 @@ class ULL ...@@ -1610,8 +1615,10 @@ class ULL
bool locked; bool locked;
pthread_cond_t cond; pthread_cond_t cond;
pthread_t thread; pthread_t thread;
ulong thread_id;
ULL(const char *key_arg,uint length) :key_length(length),count(1),locked(1) ULL(const char *key_arg,uint length, ulong id)
:key_length(length),count(1),locked(1), thread_id(id)
{ {
key=(char*) my_memdup((byte*) key_arg,length,MYF(0)); key=(char*) my_memdup((byte*) key_arg,length,MYF(0));
pthread_cond_init(&cond,NULL); pthread_cond_init(&cond,NULL);
...@@ -1815,7 +1822,7 @@ longlong Item_func_get_lock::val_int() ...@@ -1815,7 +1822,7 @@ longlong Item_func_get_lock::val_int()
if (!(ull= ((ULL*) hash_search(&hash_user_locks,(byte*) res->ptr(), if (!(ull= ((ULL*) hash_search(&hash_user_locks,(byte*) res->ptr(),
res->length())))) res->length()))))
{ {
ull=new ULL(res->ptr(),res->length()); ull=new ULL(res->ptr(),res->length(), thd->thread_id);
if (!ull || !ull->initialized()) if (!ull || !ull->initialized())
{ {
delete ull; delete ull;
...@@ -2676,6 +2683,28 @@ longlong Item_func_is_free_lock::val_int() ...@@ -2676,6 +2683,28 @@ longlong Item_func_is_free_lock::val_int()
return 0; return 0;
} }
longlong Item_func_is_used_lock::val_int()
{
String *res=args[0]->val_str(&value);
THD *thd=current_thd;
ULL *ull;
null_value=1;
if (!res || !res->length())
return 0;
pthread_mutex_lock(&LOCK_user_locks);
ull= (ULL*) hash_search(&hash_user_locks,(byte*) res->ptr(),
res->length());
pthread_mutex_unlock(&LOCK_user_locks);
if (!ull || !ull->locked)
return 0;
null_value=0;
return ull->thread_id;
}
/************************************************************************** /**************************************************************************
Spatial functions Spatial functions
......
...@@ -1162,6 +1162,16 @@ class Item_func_is_free_lock :public Item_int_func ...@@ -1162,6 +1162,16 @@ class Item_func_is_free_lock :public Item_int_func
void fix_length_and_dec() { decimals=0; max_length=1; maybe_null=1;} void fix_length_and_dec() { decimals=0; max_length=1; maybe_null=1;}
}; };
class Item_func_is_used_lock :public Item_int_func
{
String value;
public:
Item_func_is_used_lock(Item *a) :Item_int_func(a) {}
longlong val_int();
const char *func_name() const { return "is_used_lock"; }
void fix_length_and_dec() { decimals=0; max_length=10; maybe_null=1;}
};
/* For type casts */ /* For type casts */
enum Item_cast enum Item_cast
......
...@@ -2041,6 +2041,7 @@ String *Item_func_conv_charset::val_str(String *str) ...@@ -2041,6 +2041,7 @@ String *Item_func_conv_charset::val_str(String *str)
void Item_func_conv_charset::fix_length_and_dec() void Item_func_conv_charset::fix_length_and_dec()
{ {
set_charset(conv_charset);
max_length = args[0]->max_length*conv_charset->mbmaxlen; max_length = args[0]->max_length*conv_charset->mbmaxlen;
set_charset(conv_charset, COER_IMPLICIT); set_charset(conv_charset, COER_IMPLICIT);
} }
...@@ -2114,25 +2115,6 @@ String *Item_func_conv_charset3::val_str(String *str) ...@@ -2114,25 +2115,6 @@ String *Item_func_conv_charset3::val_str(String *str)
} }
bool Item_func_conv_charset::fix_fields(THD *thd,struct st_table_list *tables, Item **ref)
{
char buff[STACK_BUFF_ALLOC]; // Max argument in function
used_tables_cache=0;
const_item_cache=1;
if (thd && check_stack_overrun(thd,buff))
return 0; // Fatal error if flag is set!
if (args[0]->fix_fields(thd, tables, args) || args[0]->check_cols(1))
return 1;
maybe_null=args[0]->maybe_null;
const_item_cache=args[0]->const_item();
set_charset(conv_charset);
fix_length_and_dec();
fixed= 1;
return 0;
}
void Item_func_conv_charset3::fix_length_and_dec() void Item_func_conv_charset3::fix_length_and_dec()
{ {
max_length = args[0]->max_length; max_length = args[0]->max_length;
...@@ -2147,24 +2129,11 @@ String *Item_func_set_collation::val_str(String *str) ...@@ -2147,24 +2129,11 @@ String *Item_func_set_collation::val_str(String *str)
return str; return str;
} }
bool Item_func_set_collation::fix_fields(THD *thd,struct st_table_list *tables, Item **ref) void Item_func_set_collation::fix_length_and_dec()
{ {
CHARSET_INFO *set_collation; CHARSET_INFO *set_collation;
String tmp, *str;
const char *colname; const char *colname;
char buff[STACK_BUFF_ALLOC]; // Max argument in function String tmp, *str= args[1]->val_str(&tmp);
used_tables_cache=0;
const_item_cache=1;
if (thd && check_stack_overrun(thd,buff))
return 0; // Fatal error if flag is set!
if (args[0]->fix_fields(thd, tables, args) || args[0]->check_cols(1))
return 1;
if (args[0]->fix_fields(thd, tables, args) || args[0]->check_cols(1))
return 2;
maybe_null=args[0]->maybe_null || args[1]->maybe_null;
str= args[1]->val_str(&tmp);
colname= str->c_ptr(); colname= str->c_ptr();
if (!strncmp(colname,"BINARY",6)) if (!strncmp(colname,"BINARY",6))
set_collation= get_charset_by_csname(args[0]->charset()->csname, set_collation= get_charset_by_csname(args[0]->charset()->csname,
...@@ -2175,24 +2144,20 @@ bool Item_func_set_collation::fix_fields(THD *thd,struct st_table_list *tables, ...@@ -2175,24 +2144,20 @@ bool Item_func_set_collation::fix_fields(THD *thd,struct st_table_list *tables,
if (!set_collation) if (!set_collation)
{ {
my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), str->c_ptr()); my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), str->c_ptr());
return 1; return;
} }
if (!my_charset_same(args[0]->charset(),set_collation)) if (!my_charset_same(args[0]->charset(),set_collation))
{ {
my_error(ER_COLLATION_CHARSET_MISMATCH, MYF(0), my_error(ER_COLLATION_CHARSET_MISMATCH, MYF(0),
set_collation->name,args[0]->charset()->csname); set_collation->name,args[0]->charset()->csname);
return 1; return;
} }
set_charset(set_collation, COER_EXPLICIT); set_charset(set_collation, COER_EXPLICIT);
with_sum_func= with_sum_func || args[0]->with_sum_func; max_length= args[0]->max_length;
used_tables_cache=args[0]->used_tables();
const_item_cache=args[0]->const_item();
fix_length_and_dec();
fixed= 1;
return 0;
} }
bool Item_func_set_collation::eq(const Item *item, bool binary_cmp) const bool Item_func_set_collation::eq(const Item *item, bool binary_cmp) const
{ {
/* Assume we don't have rtti */ /* Assume we don't have rtti */
......
...@@ -577,7 +577,6 @@ class Item_func_conv_charset :public Item_str_func ...@@ -577,7 +577,6 @@ class Item_func_conv_charset :public Item_str_func
public: public:
Item_func_conv_charset(Item *a, CHARSET_INFO *cs) :Item_str_func(a) Item_func_conv_charset(Item *a, CHARSET_INFO *cs) :Item_str_func(a)
{ conv_charset=cs; } { conv_charset=cs; }
bool fix_fields(THD *thd,struct st_table_list *tables,Item **ref);
String *val_str(String *); String *val_str(String *);
void fix_length_and_dec(); void fix_length_and_dec();
const char *func_name() const { return "conv_charset"; } const char *func_name() const { return "conv_charset"; }
...@@ -588,9 +587,7 @@ class Item_func_set_collation :public Item_str_func ...@@ -588,9 +587,7 @@ class Item_func_set_collation :public Item_str_func
public: public:
Item_func_set_collation(Item *a, Item *b) :Item_str_func(a,b) {}; Item_func_set_collation(Item *a, Item *b) :Item_str_func(a,b) {};
String *val_str(String *); String *val_str(String *);
bool fix_fields(THD *thd,struct st_table_list *tables, Item **ref); void fix_length_and_dec();
void fix_length_and_dec()
{ max_length = args[0]->max_length; }
bool eq(const Item *item, bool binary_cmp) const; bool eq(const Item *item, bool binary_cmp) const;
const char *func_name() const { return "set_collation"; } const char *func_name() const { return "set_collation"; }
}; };
......
...@@ -512,6 +512,7 @@ static SYMBOL sql_functions[] = { ...@@ -512,6 +512,7 @@ static SYMBOL sql_functions[] = {
{ "ISEMPTY", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_isempty)}, { "ISEMPTY", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_isempty)},
{ "ISNULL", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_isnull)}, { "ISNULL", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_isnull)},
{ "IS_FREE_LOCK", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_is_free_lock)}, { "IS_FREE_LOCK", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_is_free_lock)},
{ "IS_USED_LOCK", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_is_used_lock)},
{ "LAST_INSERT_ID", SYM(LAST_INSERT_ID),0,0}, { "LAST_INSERT_ID", SYM(LAST_INSERT_ID),0,0},
{ "ISSIMPLE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_issimple)}, { "ISSIMPLE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_issimple)},
{ "LCASE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_lcase)}, { "LCASE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_lcase)},
......
...@@ -328,7 +328,7 @@ int Log_event::exec_event(struct st_relay_log_info* rli) ...@@ -328,7 +328,7 @@ int Log_event::exec_event(struct st_relay_log_info* rli)
****************************************************************************/ ****************************************************************************/
void Log_event::pack_info(Protocol *protocol) void Log_event::pack_info(Protocol *protocol)
{ {
protocol->store("",0); protocol->store("", &my_charset_bin);
} }
......
...@@ -62,7 +62,9 @@ char* query_table_status(THD *thd,const char *db,const char *table_name); ...@@ -62,7 +62,9 @@ char* query_table_status(THD *thd,const char *db,const char *table_name);
#endif #endif
#endif #endif
#define files_charset_info system_charset_info extern CHARSET_INFO *system_charset_info;
extern CHARSET_INFO *files_charset_info;
extern CHARSET_INFO *national_charset_info;
/*************************************************************************** /***************************************************************************
Configuration parameters Configuration parameters
......
...@@ -894,7 +894,7 @@ extern "C" void unireg_abort(int exit_code) ...@@ -894,7 +894,7 @@ extern "C" void unireg_abort(int exit_code)
DBUG_ENTER("unireg_abort"); DBUG_ENTER("unireg_abort");
if (exit_code) if (exit_code)
sql_print_error("Aborting\n"); sql_print_error("Aborting\n");
clean_up(1); /* purecov: inspected */ clean_up(exit_code || !opt_bootstrap); /* purecov: inspected */
DBUG_PRINT("quit",("done with cleanup in unireg_abort")); DBUG_PRINT("quit",("done with cleanup in unireg_abort"));
my_thread_end(); my_thread_end();
clean_up_mutexes(); clean_up_mutexes();
...@@ -4551,6 +4551,7 @@ static void set_options(void) ...@@ -4551,6 +4551,7 @@ static void set_options(void)
sizeof(mysql_real_data_home)-1); sizeof(mysql_real_data_home)-1);
/* Set default values for some variables */ /* Set default values for some variables */
global_system_variables.convert_result_charset= TRUE;
global_system_variables.table_type= DB_TYPE_MYISAM; global_system_variables.table_type= DB_TYPE_MYISAM;
global_system_variables.tx_isolation= ISO_REPEATABLE_READ; global_system_variables.tx_isolation= ISO_REPEATABLE_READ;
global_system_variables.select_limit= (ulonglong) HA_POS_ERROR; global_system_variables.select_limit= (ulonglong) HA_POS_ERROR;
......
...@@ -703,11 +703,13 @@ bool Protocol_simple::store(const char *from, uint length, CHARSET_INFO *cs) ...@@ -703,11 +703,13 @@ bool Protocol_simple::store(const char *from, uint length, CHARSET_INFO *cs)
field_types[field_pos] <= MYSQL_TYPE_GEOMETRY)); field_types[field_pos] <= MYSQL_TYPE_GEOMETRY));
field_pos++; field_pos++;
#endif #endif
if (cs != this->thd->charset()) if (!my_charset_same(cs, this->thd->charset()) &&
(cs != &my_charset_bin) &&
(this->thd->charset() != &my_charset_bin) &&
(this->thd->variables.convert_result_charset))
{ {
String tmp; convert.copy(from, length, cs, this->thd->charset());
tmp.copy(from, length, cs, this->thd->charset()); return net_store_data(convert.ptr(), convert.length());
return net_store_data(tmp.ptr(), tmp.length());
} }
else else
return net_store_data(from, length); return net_store_data(from, length);
...@@ -800,16 +802,18 @@ bool Protocol_simple::store(Field *field) ...@@ -800,16 +802,18 @@ bool Protocol_simple::store(Field *field)
field_pos++; field_pos++;
#endif #endif
char buff[MAX_FIELD_WIDTH]; char buff[MAX_FIELD_WIDTH];
String tmp1(buff,sizeof(buff), &my_charset_bin); String str(buff,sizeof(buff), &my_charset_bin);
field->val_str(&tmp1,&tmp1); field->val_str(&str,&str);
if (field->charset() != this->thd->charset()) 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))
{ {
String tmp; convert.copy(str.ptr(), str.length(), str.charset(), this->thd->charset());
tmp.copy(tmp1.ptr(), tmp1.length(), tmp1.charset(), this->thd->charset()); return net_store_data(convert.ptr(), convert.length());
return net_store_data(tmp.ptr(), tmp.length());
} }
else else
return net_store_data(tmp1.ptr(), tmp1.length()); return net_store_data(str.ptr(), str.length());
} }
......
...@@ -30,6 +30,7 @@ class Protocol ...@@ -30,6 +30,7 @@ class Protocol
protected: protected:
THD *thd; THD *thd;
String *packet; String *packet;
String convert;
uint field_pos; uint field_pos;
#ifndef DEBUG_OFF #ifndef DEBUG_OFF
enum enum_field_types *field_types; enum enum_field_types *field_types;
...@@ -44,6 +45,7 @@ class Protocol ...@@ -44,6 +45,7 @@ class Protocol
public: public:
Protocol() {} Protocol() {}
Protocol(THD *thd) { init(thd); } Protocol(THD *thd) { init(thd); }
virtual ~Protocol() {}
void init(THD* thd); void init(THD* thd);
bool send_fields(List<Item> *list, uint flag); bool send_fields(List<Item> *list, uint flag);
bool send_records_num(List<Item> *list, ulonglong records); bool send_records_num(List<Item> *list, ulonglong records);
......
...@@ -109,6 +109,8 @@ sys_var_bool_ptr sys_concurrent_insert("concurrent_insert", ...@@ -109,6 +109,8 @@ sys_var_bool_ptr sys_concurrent_insert("concurrent_insert",
&myisam_concurrent_insert); &myisam_concurrent_insert);
sys_var_long_ptr sys_connect_timeout("connect_timeout", sys_var_long_ptr sys_connect_timeout("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", sys_var_enum sys_delay_key_write("delay_key_write",
&delay_key_write_options, &delay_key_write_options,
&delay_key_write_typelib, &delay_key_write_typelib,
...@@ -337,6 +339,7 @@ sys_var *sys_variables[]= ...@@ -337,6 +339,7 @@ sys_var *sys_variables[]=
&sys_client_collation, &sys_client_collation,
&sys_concurrent_insert, &sys_concurrent_insert,
&sys_connect_timeout, &sys_connect_timeout,
&sys_convert_result_charset,
&sys_default_week_format, &sys_default_week_format,
&sys_delay_key_write, &sys_delay_key_write,
&sys_delayed_insert_limit, &sys_delayed_insert_limit,
...@@ -445,6 +448,7 @@ struct show_var_st init_vars[]= { ...@@ -445,6 +448,7 @@ struct show_var_st init_vars[]= {
{sys_client_collation.name, (char*) &sys_client_collation, SHOW_SYS}, {sys_client_collation.name, (char*) &sys_client_collation, SHOW_SYS},
{sys_concurrent_insert.name,(char*) &sys_concurrent_insert, SHOW_SYS}, {sys_concurrent_insert.name,(char*) &sys_concurrent_insert, SHOW_SYS},
{sys_connect_timeout.name, (char*) &sys_connect_timeout, 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}, {"datadir", mysql_real_data_home, SHOW_CHAR},
{"default_week_format", (char*) &sys_default_week_format, SHOW_SYS}, {"default_week_format", (char*) &sys_default_week_format, SHOW_SYS},
{sys_delay_key_write.name, (char*) &sys_delay_key_write, SHOW_SYS}, {sys_delay_key_write.name, (char*) &sys_delay_key_write, SHOW_SYS},
...@@ -1455,7 +1459,6 @@ void set_var_init() ...@@ -1455,7 +1459,6 @@ void set_var_init()
(*var)->option_limits= find_option(my_long_options, (*var)->name); (*var)->option_limits= find_option(my_long_options, (*var)->name);
hash_insert(&system_variable_hash, (byte*) *var); hash_insert(&system_variable_hash, (byte*) *var);
} }
/* /*
Special cases Special cases
Needed because MySQL can't find the limits for a variable it it has Needed because MySQL can't find the limits for a variable it it has
......
...@@ -374,6 +374,7 @@ struct system_variables ...@@ -374,6 +374,7 @@ struct system_variables
my_bool log_warnings; my_bool log_warnings;
my_bool low_priority_updates; my_bool low_priority_updates;
my_bool new_mode; my_bool new_mode;
my_bool convert_result_charset;
CHARSET_INFO *thd_charset; CHARSET_INFO *thd_charset;
}; };
......
...@@ -29,6 +29,9 @@ ...@@ -29,6 +29,9 @@
#endif #endif
CHARSET_INFO *system_charset_info= &my_charset_utf8; CHARSET_INFO *system_charset_info= &my_charset_utf8;
CHARSET_INFO *files_charset_info= &my_charset_utf8;
CHARSET_INFO *national_charset_info= &my_charset_utf8;
extern gptr sql_alloc(unsigned size); extern gptr sql_alloc(unsigned size);
extern void sql_element_free(void *ptr); extern void sql_element_free(void *ptr);
static uint32 static uint32
......
...@@ -1134,10 +1134,10 @@ type: ...@@ -1134,10 +1134,10 @@ type:
$$=FIELD_TYPE_STRING; } $$=FIELD_TYPE_STRING; }
| nchar '(' NUM ')' { Lex->length=$3.str; | nchar '(' NUM ')' { Lex->length=$3.str;
$$=FIELD_TYPE_STRING; $$=FIELD_TYPE_STRING;
Lex->charset=&my_charset_utf8; } Lex->charset=national_charset_info; }
| nchar { Lex->length=(char*) "1"; | nchar { Lex->length=(char*) "1";
$$=FIELD_TYPE_STRING; $$=FIELD_TYPE_STRING;
Lex->charset=&my_charset_utf8; } Lex->charset=national_charset_info; }
| BINARY '(' NUM ')' { Lex->length=$3.str; | BINARY '(' NUM ')' { Lex->length=$3.str;
Lex->charset=&my_charset_bin; Lex->charset=&my_charset_bin;
$$=FIELD_TYPE_STRING; } $$=FIELD_TYPE_STRING; }
...@@ -1145,7 +1145,7 @@ type: ...@@ -1145,7 +1145,7 @@ type:
$$=FIELD_TYPE_VAR_STRING; } $$=FIELD_TYPE_VAR_STRING; }
| nvarchar '(' NUM ')' { Lex->length=$3.str; | nvarchar '(' NUM ')' { Lex->length=$3.str;
$$=FIELD_TYPE_VAR_STRING; $$=FIELD_TYPE_VAR_STRING;
Lex->charset= &my_charset_utf8; } Lex->charset=national_charset_info; }
| VARBINARY '(' NUM ')' { Lex->length=$3.str; | VARBINARY '(' NUM ')' { Lex->length=$3.str;
Lex->charset=&my_charset_bin; Lex->charset=&my_charset_bin;
$$=FIELD_TYPE_VAR_STRING; } $$=FIELD_TYPE_VAR_STRING; }
...@@ -2023,11 +2023,6 @@ expr_expr: ...@@ -2023,11 +2023,6 @@ expr_expr:
{ $$= new Item_date_add_interval($1,$3,$4,0); } { $$= new Item_date_add_interval($1,$3,$4,0); }
| expr '-' interval_expr interval | expr '-' interval_expr interval
{ $$= new Item_date_add_interval($1,$3,$4,1); } { $$= new Item_date_add_interval($1,$3,$4,1); }
| expr COLLATE_SYM ident_or_text
{
$$= new Item_func_set_collation($1,new Item_string($3.str,$3.length,
YYTHD->variables.thd_charset));
}
; ;
/* expressions that begin with 'expr' that do NOT follow IN_SYM */ /* expressions that begin with 'expr' that do NOT follow IN_SYM */
...@@ -2137,6 +2132,11 @@ interval_expr: ...@@ -2137,6 +2132,11 @@ interval_expr:
simple_expr: simple_expr:
simple_ident simple_ident
| simple_expr COLLATE_SYM ident_or_text %prec NEG
{
$$= new Item_func_set_collation($1,new Item_string($3.str,$3.length,
YYTHD->variables.thd_charset));
}
| literal | literal
| param_marker | param_marker
| '@' ident_or_text SET_VAR expr | '@' ident_or_text SET_VAR expr
...@@ -3865,9 +3865,9 @@ text_literal: ...@@ -3865,9 +3865,9 @@ text_literal:
$$ = new Item_string($1.str,$1.length,cs); $$ = new Item_string($1.str,$1.length,cs);
} }
| NCHAR_STRING | NCHAR_STRING
{ $$= new Item_string($1.str,$1.length,&my_charset_utf8); } { $$= new Item_string($1.str,$1.length,national_charset_info); }
| UNDERSCORE_CHARSET TEXT_STRING | UNDERSCORE_CHARSET TEXT_STRING
{ $$ = new Item_string($2.str,$2.length,Lex->charset,Item::COER_IMPLICIT); } { $$ = new Item_string($2.str,$2.length,Lex->charset); }
| text_literal TEXT_STRING_db | text_literal TEXT_STRING_db
{ ((Item_string*) $1)->append($2.str,$2.length); } { ((Item_string*) $1)->append($2.str,$2.length); }
; ;
...@@ -3913,9 +3913,8 @@ literal: ...@@ -3913,9 +3913,8 @@ literal:
{ {
Item *tmp= new Item_varbinary($2.str,$2.length); Item *tmp= new Item_varbinary($2.str,$2.length);
String *str= tmp ? tmp->val_str((String*) 0) : (String*) 0; String *str= tmp ? tmp->val_str((String*) 0) : (String*) 0;
$$ = new Item_string(str ? str->ptr() : "", $$ = new Item_string(str ? str->ptr() : "", str ? str->length() : 0,
str ? str->length() : 0, Lex->charset);
Lex->charset,Item::COER_IMPLICIT);
} }
| DATE_SYM text_literal { $$ = $2; } | DATE_SYM text_literal { $$ = $2; }
| TIME_SYM text_literal { $$ = $2; } | TIME_SYM text_literal { $$ = $2; }
...@@ -4340,18 +4339,18 @@ option_value: ...@@ -4340,18 +4339,18 @@ option_value:
find_sys_var("tx_isolation"), find_sys_var("tx_isolation"),
new Item_int((int32) $4))); new Item_int((int32) $4)));
} }
| charset opt_equal set_expr_or_default | charset set_expr_or_default
{ {
THD *thd= YYTHD; THD *thd= YYTHD;
LEX *lex= &thd->lex; LEX *lex= &thd->lex;
if (!$3) if (!$2)
{ {
CHARSET_INFO *cl= thd->db_charset; CHARSET_INFO *cl= thd->db_charset;
$3= new Item_string(cl->name, strlen(cl->name), &my_charset_latin1); $2= new Item_string(cl->name, strlen(cl->name), &my_charset_latin1);
} }
lex->var_list.push_back(new set_var(lex->option_type, lex->var_list.push_back(new set_var(lex->option_type,
find_sys_var("client_collation"), find_sys_var("client_collation"),
$3)); $2));
} }
| NAMES_SYM charset_name_or_default opt_collate | NAMES_SYM charset_name_or_default opt_collate
{ {
......
...@@ -515,6 +515,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, ...@@ -515,6 +515,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
keyinfo->key_length+= HA_KEY_NULL_LENGTH; keyinfo->key_length+= HA_KEY_NULL_LENGTH;
} }
if (field->type() == FIELD_TYPE_BLOB || if (field->type() == FIELD_TYPE_BLOB ||
field->type() == FIELD_TYPE_GEOMETRY ||
field->real_type() == FIELD_TYPE_VAR_STRING) field->real_type() == FIELD_TYPE_VAR_STRING)
{ {
if (field->type() == FIELD_TYPE_BLOB) if (field->type() == FIELD_TYPE_BLOB)
...@@ -531,7 +532,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, ...@@ -531,7 +532,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
if (i == 0) if (i == 0)
field->key_start|= ((key_map) 1 << key); field->key_start|= ((key_map) 1 << key);
if (field->key_length() == key_part->length && if (field->key_length() == key_part->length &&
field->type() != FIELD_TYPE_BLOB) !(field->flags & BLOB_FLAG))
{ {
if ((index_flags & HA_KEY_READ_ONLY) && if ((index_flags & HA_KEY_READ_ONLY) &&
(field->key_type() != HA_KEYTYPE_TEXT || (field->key_type() != HA_KEYTYPE_TEXT ||
...@@ -560,7 +561,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, ...@@ -560,7 +561,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
if (field->key_length() != key_part->length) if (field->key_length() != key_part->length)
{ {
key_part->key_part_flag|= HA_PART_KEY; key_part->key_part_flag|= HA_PART_KEY;
if (field->type() != FIELD_TYPE_BLOB) if (!(field->flags & BLOB_FLAG))
{ // Create a new field { // Create a new field
field=key_part->field=field->new_field(&outparam->mem_root, field=key_part->field=field->new_field(&outparam->mem_root,
outparam); outparam);
......
...@@ -1585,14 +1585,15 @@ static uchar to_upper_utf8[] = { ...@@ -1585,14 +1585,15 @@ static uchar to_upper_utf8[] = {
}; };
static int my_utf8_uni (CHARSET_INFO *cs __attribute__((unused)) , static int my_utf8_uni(CHARSET_INFO *cs __attribute__((unused)),
my_wc_t * pwc, const uchar *s, const uchar *e) my_wc_t * pwc, const uchar *s, const uchar *e)
{ {
unsigned char c = s[0]; unsigned char c;
if (s >= e) if (s >= e)
return MY_CS_TOOFEW(0); return MY_CS_TOOFEW(0);
c= s[0];
if (c < 0x80) if (c < 0x80)
{ {
*pwc = c; *pwc = c;
...@@ -1624,10 +1625,8 @@ static int my_utf8_uni (CHARSET_INFO *cs __attribute__((unused)) , ...@@ -1624,10 +1625,8 @@ static int my_utf8_uni (CHARSET_INFO *cs __attribute__((unused)) ,
(my_wc_t) (s[2] ^ 0x80); (my_wc_t) (s[2] ^ 0x80);
return 3; return 3;
#ifdef UNICODE_32BIT
} }
#ifdef UNICODE_32BIT
else if (c < 0xf8 && sizeof(my_wc_t)*8 >= 32) else if (c < 0xf8 && sizeof(my_wc_t)*8 >= 32)
{ {
if (s+4 > e) /* We need 4 characters */ if (s+4 > e) /* We need 4 characters */
...@@ -1685,9 +1684,9 @@ static int my_utf8_uni (CHARSET_INFO *cs __attribute__((unused)) , ...@@ -1685,9 +1684,9 @@ static int my_utf8_uni (CHARSET_INFO *cs __attribute__((unused)) ,
| ((my_wc_t) (s[4] ^ 0x80) << 6) | ((my_wc_t) (s[4] ^ 0x80) << 6)
| (my_wc_t) (s[5] ^ 0x80); | (my_wc_t) (s[5] ^ 0x80);
return 6; return 6;
}
#endif #endif
} else return MY_CS_ILSEQ;
return MY_CS_ILSEQ;
} }
static int my_uni_utf8 (CHARSET_INFO *cs __attribute__((unused)) , static int my_uni_utf8 (CHARSET_INFO *cs __attribute__((unused)) ,
......
...@@ -34,8 +34,7 @@ pkgdata_DATA = my-small.cnf \ ...@@ -34,8 +34,7 @@ pkgdata_DATA = my-small.cnf \
my-large.cnf \ my-large.cnf \
my-huge.cnf \ my-huge.cnf \
mysql-log-rotate \ mysql-log-rotate \
mysql-@VERSION@.spec \ mysql-@VERSION@.spec
binary-configure
pkgdata_SCRIPTS = mysql.server pkgdata_SCRIPTS = mysql.server
...@@ -48,7 +47,6 @@ CLEANFILES = my-small.cnf \ ...@@ -48,7 +47,6 @@ CLEANFILES = my-small.cnf \
mysql-log-rotate \ mysql-log-rotate \
mysql.server \ mysql.server \
binary-configure binary-configure
mysql-@VERSION@.spec: mysql.spec mysql-@VERSION@.spec: mysql.spec
rm -f $@ rm -f $@
...@@ -98,5 +96,7 @@ SUFFIXES = .sh ...@@ -98,5 +96,7 @@ SUFFIXES = .sh
$< > $@-t $< > $@-t
@MV@ $@-t $@ @MV@ $@-t $@
all: binary-configure
# Don't update the files from bitkeeper # Don't update the files from bitkeeper
%::SCCS/s.% %::SCCS/s.%
...@@ -14,11 +14,11 @@ echo "and start the MySQL server for you. If you run into any trouble, please" ...@@ -14,11 +14,11 @@ echo "and start the MySQL server for you. If you run into any trouble, please"
echo "consult the MySQL manual, that you can find in the Docs directory." echo "consult the MySQL manual, that you can find in the Docs directory."
echo "" echo ""
./scripts/mysql_install_db ./scripts/mysql_install_db --no-defaults
if [ $? = 0 ] if [ $? = 0 ]
then then
echo "Starting the mysqld server. You can test that it is up and running" echo "Starting the mysqld server. You can test that it is up and running"
echo "with the command:" echo "with the command:"
echo "./bin/mysqladmin version" echo "./bin/mysqladmin version"
./bin/mysqld_safe & ./bin/mysqld_safe --no-defaults &
fi fi
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment