summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormonty@mysql.com <>2004-02-09 12:31:03 +0100
committermonty@mysql.com <>2004-02-09 12:31:03 +0100
commit06432eac3606d75045109e3bad2538543f1a574b (patch)
tree4cdb6965fba280ace2fc30421a0f25332597e43e
parent480b082cf44db4fb2722e256f16e5f8c7c537bcf (diff)
downloadmariadb-git-06432eac3606d75045109e3bad2538543f1a574b.tar.gz
Added --compact to mysqlbinlog
Fixed output from mysqlbinlog when using --skip-comments Fixed warnings from valgrind Fixed ref_length when used with HEAP tables More efficent need_conversion() Fixed error handling in UPDATE with not updateable tables Fixed bug in null handling in CAST to signed/unsigned
-rw-r--r--client/client_priv.h33
-rw-r--r--client/mysqldump.c47
-rw-r--r--mysql-test/r/cast.result27
-rw-r--r--mysql-test/r/derived.result8
-rw-r--r--mysql-test/r/mysqldump.result23
-rw-r--r--mysql-test/r/query_cache.result9
-rw-r--r--mysql-test/r/rpl_until.result2
-rw-r--r--mysql-test/r/sql_mode.result2
-rw-r--r--mysql-test/r/subselect.result68
-rw-r--r--mysql-test/t/cast.test9
-rw-r--r--mysql-test/t/derived.test4
-rw-r--r--mysql-test/t/query_cache.test8
-rw-r--r--mysql-test/t/rpl_until.test5
-rw-r--r--mysql-test/t/subselect.test64
-rw-r--r--sql/field.cc20
-rw-r--r--sql/ha_heap.cc2
-rw-r--r--sql/item_func.cc5
-rw-r--r--sql/item_func.h20
-rw-r--r--sql/item_strfunc.cc60
-rw-r--r--sql/item_sum.cc18
-rw-r--r--sql/item_sum.h7
-rw-r--r--sql/opt_range.cc2
-rw-r--r--sql/sql_class.cc2
-rw-r--r--sql/sql_class.h4
-rw-r--r--sql/sql_prepare.cc2
-rw-r--r--sql/sql_show.cc3
-rw-r--r--sql/sql_string.cc118
-rw-r--r--sql/sql_string.h8
-rw-r--r--sql/sql_update.cc3
-rw-r--r--sql/sql_yacc.yy28
30 files changed, 327 insertions, 284 deletions
diff --git a/client/client_priv.h b/client/client_priv.h
index f6d766b7ef9..910de1f03e9 100644
--- a/client/client_priv.h
+++ b/client/client_priv.h
@@ -26,18 +26,21 @@
/* We have to define 'enum options' identical in all files to keep OS2 happy */
-enum options_client { OPT_CHARSETS_DIR=256, OPT_DEFAULT_CHARSET,
- OPT_PAGER, OPT_NOPAGER, OPT_TEE, OPT_NOTEE,
- OPT_LOW_PRIORITY, OPT_AUTO_REPAIR, OPT_COMPRESS,
- OPT_DROP, OPT_LOCKS, OPT_KEYWORDS, OPT_DELAYED, OPT_OPTIMIZE,
- OPT_FTB, OPT_LTB, OPT_ENC, OPT_O_ENC, OPT_ESC, OPT_TABLES,
- OPT_MASTER_DATA, OPT_AUTOCOMMIT, OPT_AUTO_REHASH,
- OPT_LINE_NUMBERS, OPT_COLUMN_NAMES, OPT_CONNECT_TIMEOUT,
- OPT_MAX_ALLOWED_PACKET, OPT_NET_BUFFER_LENGTH,
- OPT_SELECT_LIMIT, OPT_MAX_JOIN_SIZE, OPT_SSL_SSL,
- OPT_SSL_KEY, OPT_SSL_CERT, OPT_SSL_CA, OPT_SSL_CAPATH,
- OPT_SSL_CIPHER, OPT_SHUTDOWN_TIMEOUT, OPT_LOCAL_INFILE,
- OPT_DELETE_MASTER_LOGS,
- OPT_PROMPT, OPT_IGN_LINES,OPT_TRANSACTION,OPT_MYSQL_PROTOCOL,
- OPT_SHARED_MEMORY_BASE_NAME, OPT_FRM, OPT_SKIP_OPTIMIZATION,
- OPT_COMPATIBLE, OPT_RECONNECT, OPT_DELIMITER, OPT_SECURE_AUTH };
+enum options_client
+{
+ OPT_CHARSETS_DIR=256, OPT_DEFAULT_CHARSET,
+ OPT_PAGER, OPT_NOPAGER, OPT_TEE, OPT_NOTEE,
+ OPT_LOW_PRIORITY, OPT_AUTO_REPAIR, OPT_COMPRESS,
+ OPT_DROP, OPT_LOCKS, OPT_KEYWORDS, OPT_DELAYED, OPT_OPTIMIZE,
+ OPT_FTB, OPT_LTB, OPT_ENC, OPT_O_ENC, OPT_ESC, OPT_TABLES,
+ OPT_MASTER_DATA, OPT_AUTOCOMMIT, OPT_AUTO_REHASH,
+ OPT_LINE_NUMBERS, OPT_COLUMN_NAMES, OPT_CONNECT_TIMEOUT,
+ OPT_MAX_ALLOWED_PACKET, OPT_NET_BUFFER_LENGTH,
+ OPT_SELECT_LIMIT, OPT_MAX_JOIN_SIZE, OPT_SSL_SSL,
+ OPT_SSL_KEY, OPT_SSL_CERT, OPT_SSL_CA, OPT_SSL_CAPATH,
+ OPT_SSL_CIPHER, OPT_SHUTDOWN_TIMEOUT, OPT_LOCAL_INFILE,
+ OPT_DELETE_MASTER_LOGS, OPT_COMPACT,
+ OPT_PROMPT, OPT_IGN_LINES,OPT_TRANSACTION,OPT_MYSQL_PROTOCOL,
+ OPT_SHARED_MEMORY_BASE_NAME, OPT_FRM, OPT_SKIP_OPTIMIZATION,
+ OPT_COMPATIBLE, OPT_RECONNECT, OPT_DELIMITER, OPT_SECURE_AUTH,
+};
diff --git a/client/mysqldump.c b/client/mysqldump.c
index 921ffbaab5b..0025968ae5b 100644
--- a/client/mysqldump.c
+++ b/client/mysqldump.c
@@ -81,7 +81,7 @@ static my_bool verbose=0,tFlag=0,cFlag=0,dFlag=0,quick= 1, extended_insert= 1,
opt_alldbs=0,opt_create_db=0,opt_first_slave=0,opt_set_names=0,
opt_autocommit=0,opt_master_data,opt_disable_keys=1,opt_xml=0,
opt_delete_master_logs=0, tty_password=0,
- opt_single_transaction=0, opt_comments= 0;
+ opt_single_transaction=0, opt_comments= 0, opt_compact= 0;
static MYSQL mysql_connection,*sock=0;
static char insert_pat[12 * 1024],*opt_password=0,*current_user=0,
*current_host=0,*path=0,*fields_terminated=0,
@@ -140,6 +140,10 @@ static struct my_option my_long_options[] =
"Change the dump to be compatible with a given mode. By default tables are dumped without any restrictions. Legal modes are: ansi, mysql323, mysql40, postgresql, oracle, mssql, db2, maxdb, no_key_options, no_table_options, no_field_options. One can use several modes separated by commas. Note: Requires MySQL server version 4.1.0 or higher. This option does a no operation on earlier server versions.",
(gptr*) &opt_compatible_mode_str, (gptr*) &opt_compatible_mode_str, 0,
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
+ {"compact", OPT_COMPACT,
+ "Give less verbose output (useful for debugging). Disables structure comments and header/footer constructs. Enables options --skip-add-drop-table --no-set-names --skip-disable-keys --skip-lock-tables",
+ (gptr*) &opt_compact, (gptr*) &opt_compact, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
+ 0, 0},
{"complete-insert", 'c', "Use complete insert statements.", (gptr*) &cFlag,
(gptr*) &cFlag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
{"compress", 'C', "Use compression in server/client protocol.",
@@ -347,15 +351,19 @@ static void write_header(FILE *sql_file, char *db_name)
fputs("<?xml version=\"1.0\"?>\n", sql_file);
fputs("<mysqldump>\n", sql_file);
}
- else if (opt_comments)
+ else if (!opt_compact)
{
- fprintf(sql_file, "-- MySQL dump %s\n--\n", DUMP_VERSION);
- fprintf(sql_file, "-- Host: %s Database: %s\n",
- current_host ? current_host : "localhost", db_name ? db_name : "");
- fputs("-- ------------------------------------------------------\n",
- sql_file);
- fprintf(sql_file, "-- Server version\t%s\n",
- mysql_get_server_info(&mysql_connection));
+ if (opt_comments)
+ {
+ fprintf(sql_file, "-- MySQL dump %s\n--\n", DUMP_VERSION);
+ fprintf(sql_file, "-- Host: %s Database: %s\n",
+ current_host ? current_host : "localhost", db_name ? db_name :
+ "");
+ fputs("-- ------------------------------------------------------\n",
+ sql_file);
+ fprintf(sql_file, "-- Server version\t%s\n",
+ mysql_get_server_info(&mysql_connection));
+ }
if (!opt_set_names)
fprintf(sql_file,"\n/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT, CHARACTER_SET_CLIENT=%s */;\n",default_charset);
fprintf(md_result_file,"\
@@ -371,17 +379,18 @@ static void write_header(FILE *sql_file, char *db_name)
static void write_footer(FILE *sql_file)
{
if (opt_xml)
- fputs("</mysqldump>", sql_file);
- else
+ fputs("</mysqldump>\n", sql_file);
+ else if (!opt_compact)
{
fprintf(md_result_file,"\n\
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;\n\
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;\n\
-/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;\n\
-/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\n\
-");
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;\n");
+ if (!opt_set_names)
+ fprintf(md_result_file,
+ "/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\n");
+ fputs("\n", sql_file);
}
- fputs("\n", sql_file);
} /* write_footer */
@@ -448,6 +457,12 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
extended_insert= opt_drop= opt_lock= quick= create_options=
opt_disable_keys= lock_tables= 0;
break;
+ case (int) OPT_COMPACT:
+ if (opt_compact)
+ {
+ opt_comments= opt_drop= opt_disable_keys= opt_lock= 0;
+ opt_set_names= 1;
+ }
case (int) OPT_TABLES:
opt_databases=0;
break;
@@ -1270,7 +1285,7 @@ static void dumpTable(uint numFields, char *table)
fprintf(md_result_file,"-- WHERE: %s\n",where);
strxmov(strend(query), " WHERE ",where,NullS);
}
- if (!opt_xml)
+ if (!opt_xml && !opt_compact)
fputs("\n", md_result_file);
if (mysql_query(sock, query))
{
diff --git a/mysql-test/r/cast.result b/mysql-test/r/cast.result
index 893452290b2..c60d8e19fb4 100644
--- a/mysql-test/r/cast.result
+++ b/mysql-test/r/cast.result
@@ -24,6 +24,12 @@ Note 1003 select high_priority ~(5) AS `~5`,cast(~(5) as signed) AS `cast(~5 as
select cast(5 as unsigned) -6.0;
cast(5 as unsigned) -6.0
-1.0
+select cast(NULL as signed), cast(1/0 as signed);
+cast(NULL as signed) cast(1/0 as signed)
+NULL NULL
+select cast(NULL as unsigned), cast(1/0 as unsigned);
+cast(NULL as unsigned) cast(1/0 as unsigned)
+NULL NULL
select cast("A" as binary) = "a", cast(BINARY "a" as CHAR) = "A";
cast("A" as binary) = "a" cast(BINARY "a" as CHAR) = "A"
0 1
@@ -36,6 +42,21 @@ cast("1:2:3" as TIME)
select CONVERT("2004-01-22 21:45:33",DATE);
CONVERT("2004-01-22 21:45:33",DATE)
2004-01-22
+select CONVERT(DATE "2004-01-22 21:45:33" USING latin1);
+CONVERT(DATE "2004-01-22 21:45:33" USING latin1)
+2004-01-22 21:45:33
+select CONVERT(DATE "2004-01-22 21:45:33",CHAR);
+CONVERT(DATE "2004-01-22 21:45:33",CHAR)
+2004-01-22 21:45:33
+select CONVERT(DATE "2004-01-22 21:45:33",CHAR(4));
+CONVERT(DATE "2004-01-22 21:45:33",CHAR(4))
+2004
+select CONVERT(DATE "2004-01-22 21:45:33",CHAR(4) BINARY);
+CONVERT(DATE "2004-01-22 21:45:33",CHAR(4) BINARY)
+2004
+select CAST(DATE "2004-01-22 21:45:33" AS CHAR(4) BINARY);
+CAST(DATE "2004-01-22 21:45:33" AS CHAR(4) BINARY)
+2004
set names binary;
select cast(_latin1'test' as char character set latin2);
cast(_latin1'test' as char character set latin2)
@@ -43,6 +64,12 @@ test
select cast(_koi8r'ΤΕΣΤ' as char character set cp1251);
cast(_koi8r'ΤΕΣΤ' as char character set cp1251)
ςερς
+select convert(_latin1'test', "latin1_german1_ci", "latin1_swedish_ci");
+convert(_latin1'test', "latin1_german1_ci", "latin1_swedish_ci")
+test
+select convert(_koi8r'ΤΕΣΤ', "koi8r_general_ci", "cp1251_general_ci");
+convert(_koi8r'ΤΕΣΤ', "koi8r_general_ci", "cp1251_general_ci")
+ςερς
create table t1 select cast(_koi8r'ΤΕΣΤ' as char character set cp1251) as t;
show create table t1;
Table Create Table
diff --git a/mysql-test/r/derived.result b/mysql-test/r/derived.result
index 170c393524b..44d35148f87 100644
--- a/mysql-test/r/derived.result
+++ b/mysql-test/r/derived.result
@@ -252,9 +252,7 @@ drop table t1;
CREATE TABLE `t1` (
`N` int(11) unsigned NOT NULL default '0',
`M` tinyint(1) default '0',
-) TYPE=MyISAM DEFAULT CHARSET=latin1;
-Warnings:
-Warning 1286 'TYPE=storage_engine' is deprecated. Use 'ENGINE=storage_engine' instead.
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO `t1` (N, M) VALUES (1, 0),(1, 0),(1, 0),(2, 0),(2, 0),(3, 0);
UPDATE `t1` AS P1 INNER JOIN (SELECT N FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N SET P1.M = 2;
select * from t1;
@@ -279,9 +277,7 @@ OBJECTID int(11) NOT NULL default '0',
SORTORDER int(11) NOT NULL auto_increment,
KEY t1_SortIndex (SORTORDER),
KEY t1_IdIndex (OBJECTID)
-) TYPE=MyISAM DEFAULT CHARSET=latin1;
-Warnings:
-Warning 1286 'TYPE=storage_engine' is deprecated. Use 'ENGINE=storage_engine' instead.
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE t2 (
ID int(11) default NULL,
PARID int(11) default NULL,
diff --git a/mysql-test/r/mysqldump.result b/mysql-test/r/mysqldump.result
index bdcdb0532f7..0414d6fa738 100644
--- a/mysql-test/r/mysqldump.result
+++ b/mysql-test/r/mysqldump.result
@@ -21,6 +21,11 @@ DROP TABLE t1;
CREATE TABLE t1 (a decimal(240, 20));
INSERT INTO t1 VALUES ("1234567890123456789012345678901234567890"),
("0987654321098765432109876543210987654321");
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT, CHARACTER_SET_CLIENT=utf8 */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=NO_AUTO_VALUE_ON_ZERO */;
DROP TABLE IF EXISTS `t1`;
CREATE TABLE `t1` (
`a` decimal(240,20) default NULL
@@ -41,6 +46,11 @@ UNLOCK TABLES;
DROP TABLE t1;
CREATE TABLE t1 (a double);
INSERT INTO t1 VALUES (-9e999999);
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT, CHARACTER_SET_CLIENT=utf8 */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=NO_AUTO_VALUE_ON_ZERO */;
DROP TABLE IF EXISTS `t1`;
CREATE TABLE `t1` (
`a` double default NULL
@@ -105,6 +115,11 @@ INSERT INTO t1 VALUES ("1\""), ("\"2");
DROP TABLE t1;
CREATE TABLE t1 (a VARCHAR(255)) DEFAULT CHARSET koi8r;
INSERT INTO t1 VALUES (_koi8r x'C1C2C3C4C5');
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT, CHARACTER_SET_CLIENT=utf8 */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=NO_AUTO_VALUE_ON_ZERO */;
DROP TABLE IF EXISTS `t1`;
CREATE TABLE `t1` (
`a` varchar(255) default NULL
@@ -125,6 +140,9 @@ UNLOCK TABLES;
DROP TABLE t1;
CREATE TABLE t1 (a int) ENGINE=MYISAM;
INSERT INTO t1 VALUES (1), (2);
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=NO_AUTO_VALUE_ON_ZERO */;
DROP TABLE IF EXISTS `t1`;
CREATE TABLE `t1` (
`a` int(11) default NULL
@@ -140,8 +158,10 @@ UNLOCK TABLES;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
-/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=NO_AUTO_VALUE_ON_ZERO */;
DROP TABLE IF EXISTS `t1`;
CREATE TABLE `t1` (
`a` int(11) default NULL
@@ -157,6 +177,5 @@ UNLOCK TABLES;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
-/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
DROP TABLE t1;
diff --git a/mysql-test/r/query_cache.result b/mysql-test/r/query_cache.result
index 49ae082dead..04bcb56d48d 100644
--- a/mysql-test/r/query_cache.result
+++ b/mysql-test/r/query_cache.result
@@ -696,17 +696,22 @@ word
show status like "Qcache_queries_in_cache";
Variable_name Value
Qcache_queries_in_cache 1
-load data infile '../../std_data/words.dat' into table t1;
+load data infile 'TEST_DIR/std_data/words.dat' into table t1;
show status like "Qcache_queries_in_cache";
Variable_name Value
Qcache_queries_in_cache 0
+select count(*) from t1;
+count(*)
+70
drop table t1;
create table t1 (a int);
insert into t1 values (1),(2),(3);
show status like "Qcache_queries_in_cache";
Variable_name Value
Qcache_queries_in_cache 0
-select * from t1 into outfile "query_caceh.out.file";
+select * from t1 into outfile "query_cache.out.file";
+select * from t1 into outfile "query_cache.out.file";
+ERROR HY000: File 'query_cache.out.file' already exists
select * from t1 limit 1 into dumpfile "query_cache.dump.file";
show status like "Qcache_queries_in_cache";
Variable_name Value
diff --git a/mysql-test/r/rpl_until.result b/mysql-test/r/rpl_until.result
index 82b1ed233ec..cb60ccfb1c9 100644
--- a/mysql-test/r/rpl_until.result
+++ b/mysql-test/r/rpl_until.result
@@ -55,7 +55,7 @@ stop slave;
start slave until master_log_file='master-bin.000001', master_log_pos=561;
show slave status;
Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master
-# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 561 slave-relay-bin.000002 # master-bin.000001 Yes No 0 0 561 # Master master-bin.000001 561 No #
+# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 561 slave-relay-bin.000002 # master-bin.000001 Yes # 0 0 561 # Master master-bin.000001 561 No #
start slave until master_log_file='master-bin', master_log_pos=561;
ERROR HY000: Wrong parameter or combination of parameters for START SLAVE UNTIL
start slave until master_log_file='master-bin.000001', master_log_pos=561, relay_log_pos=12;
diff --git a/mysql-test/r/sql_mode.result b/mysql-test/r/sql_mode.result
index ddc848af1ed..77fe5d06bb0 100644
--- a/mysql-test/r/sql_mode.result
+++ b/mysql-test/r/sql_mode.result
@@ -70,7 +70,7 @@ t1 CREATE TABLE `t1` (
`email` varchar(60) NOT NULL default '',
PRIMARY KEY (`a`),
UNIQUE KEY `email` (`email`)
-) ENGINE=HEAP ROW_FORMAT=DYNAMIC
+) TYPE=HEAP ROW_FORMAT=DYNAMIC
set sql_mode="postgresql,oracle,mssql,db2,maxdb";
select @@sql_mode;
@@sql_mode
diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result
index c06c9824b33..b5ebc8d80db 100644
--- a/mysql-test/r/subselect.result
+++ b/mysql-test/r/subselect.result
@@ -1578,50 +1578,28 @@ select * from t1;
a b
1 0.123
drop table t1;
-CREATE TABLE t1 (
-id int(11) NOT NULL auto_increment,
-ts timestamp NOT NULL,
-id_cns tinyint(3) unsigned NOT NULL default '0',
-id_desc_nota int(11) NOT NULL default '1',
-id_publ_uff int(11) NOT NULL default '0',
-tipo enum('','UNO','DUE') NOT NULL default '',
-f_aggiunte set('TRE','TRETRE','QUATTRO','CINQUE','SEI','SETTE') NOT NULL
-default '',
-anno_dep smallint(4) unsigned zerofill NOT NULL default '0000',
-data_dep smallint(4) unsigned zerofill NOT NULL default '0000',
-particolare mediumint(8) unsigned NOT NULL default '0',
-generale mediumint(8) unsigned NOT NULL default '0',
-bis tinyint(3) unsigned NOT NULL default '0',
-PRIMARY KEY(id),
-UNIQUE KEY idx_cns_gen_anno (anno_dep,id_cns,generale,particolare),
-UNIQUE KEY idx_cns_par_anno (id_cns,anno_dep,tipo,particolare,bis)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1 PACK_KEYS=1;
-INSERT INTO t1 (id, ts, id_cns, id_desc_nota, id_publ_uff, tipo, f_aggiunte,
-anno_dep, data_dep, particolare, generale, bis) VALUES
-(NULL, NULL, 16, 29, 622, 'UNO', '', 1987, 1218, 2048, 9681, 0),
-(NULL, NULL, 50, 23, 1717, 'UNO', '', 1987, 1126, 1536, 13987, 0),
-(NULL, NULL, 16, 123, 123, 'UNO', '', 1987, 1221, 2432, 14594, 0),
-(NULL, NULL, 16, 124, 124, 'UNO', '', 1987, 1201, 1792, 13422, 0),
-(NULL, NULL, 16, 125, 125, 'UNO', '', 1987, 0723, 1025, 10240, 0),
-(NULL, NULL, 16, 126, 126, 'UNO', '', 1987, 1204, 1026, 7089, 0);
-CREATE TABLE t2 (
-id tinyint(3) unsigned NOT NULL auto_increment,
-descr varchar(40) NOT NULL default '',
-f_servizi set('UNO','DUE') NOT NULL default '',
-data_uno_min int(8) unsigned NOT NULL default '0',
-data_due_min int(8) unsigned NOT NULL default '0',
-max_anno_dep smallint(6) unsigned NOT NULL default '0',
-data_agg int(8) unsigned NOT NULL default '0',
-PRIMARY KEY (id)
+CREATE TABLE `t1` (
+`id` int(11) NOT NULL auto_increment,
+`id_cns` tinyint(3) unsigned NOT NULL default '0',
+`tipo` enum('','UNO','DUE') NOT NULL default '',
+`anno_dep` smallint(4) unsigned zerofill NOT NULL default '0000',
+`particolare` mediumint(8) unsigned NOT NULL default '0',
+`generale` mediumint(8) unsigned NOT NULL default '0',
+`bis` tinyint(3) unsigned NOT NULL default '0',
+PRIMARY KEY (`id`),
+UNIQUE KEY `idx_cns_gen_anno` (`anno_dep`,`id_cns`,`generale`,`particolare`),
+UNIQUE KEY `idx_cns_par_anno` (`id_cns`,`anno_dep`,`tipo`,`particolare`,`bis`)
);
-INSERT INTO t2 (id, descr, f_servizi, data_uno_min, data_due_min,
-max_anno_dep, data_agg) VALUES
-(16, 'C_UNO', 'UNO,DUE', 19000000, 30000000, 1987, 0),
-(50, 'C_TRE', 'UNO', 19000000, 30000000, 1990, 0);
-SELECT cns.max_anno_dep = (SELECT s.anno_dep FROM t1 AS s WHERE
-s.id_cns = cns.id ORDER BY s.anno_dep DESC LIMIT 1) AS PIPPO FROM
-t2 AS cns;
-PIPPO
-1
-NULL
+INSERT INTO `t1` VALUES (1,16,'UNO',1987,2048,9681,0),(2,50,'UNO',1987,1536,13987,0),(3,16,'UNO',1987,2432,14594,0),(4,16,'UNO',1987,1792,13422,0),(5,16,'UNO',1987,1025,10240,0),(6,16,'UNO',1987,1026,7089,0);
+CREATE TABLE `t2` (
+`id` tinyint(3) unsigned NOT NULL auto_increment,
+`max_anno_dep` smallint(6) unsigned NOT NULL default '0',
+PRIMARY KEY (`id`)
+);
+INSERT INTO `t2` VALUES (16,1987),(50,1990),(51,1990);
+SELECT cns.id, cns.max_anno_dep, cns.max_anno_dep = (SELECT s.anno_dep FROM t1 AS s WHERE s.id_cns = cns.id ORDER BY s.anno_dep DESC LIMIT 1) AS PIPPO FROM t2 AS cns;
+id max_anno_dep PIPPO
+16 1987 1
+50 1990 0
+51 1990 NULL
DROP TABLE t1, t2;
diff --git a/mysql-test/t/cast.test b/mysql-test/t/cast.test
index e1cfe5760ee..ab0242990fc 100644
--- a/mysql-test/t/cast.test
+++ b/mysql-test/t/cast.test
@@ -10,10 +10,17 @@ select cast(-5 as unsigned) -1, cast(-5 as unsigned) + 1;
select ~5, cast(~5 as signed);
explain extended select ~5, cast(~5 as signed);
select cast(5 as unsigned) -6.0;
+select cast(NULL as signed), cast(1/0 as signed);
+select cast(NULL as unsigned), cast(1/0 as unsigned);
select cast("A" as binary) = "a", cast(BINARY "a" as CHAR) = "A";
select cast("2001-1-1" as DATE), cast("2001-1-1" as DATETIME);
select cast("1:2:3" as TIME);
select CONVERT("2004-01-22 21:45:33",DATE);
+select CONVERT(DATE "2004-01-22 21:45:33" USING latin1);
+select CONVERT(DATE "2004-01-22 21:45:33",CHAR);
+select CONVERT(DATE "2004-01-22 21:45:33",CHAR(4));
+select CONVERT(DATE "2004-01-22 21:45:33",CHAR(4) BINARY);
+select CAST(DATE "2004-01-22 21:45:33" AS CHAR(4) BINARY);
#
# Character set convertion
@@ -21,6 +28,8 @@ select CONVERT("2004-01-22 21:45:33",DATE);
set names binary;
select cast(_latin1'test' as char character set latin2);
select cast(_koi8r'ΤΕΣΤ' as char character set cp1251);
+select convert(_latin1'test', "latin1_german1_ci", "latin1_swedish_ci");
+select convert(_koi8r'ΤΕΣΤ', "koi8r_general_ci", "cp1251_general_ci");
create table t1 select cast(_koi8r'ΤΕΣΤ' as char character set cp1251) as t;
show create table t1;
drop table t1;
diff --git a/mysql-test/t/derived.test b/mysql-test/t/derived.test
index 154fc4b3834..8646a98551f 100644
--- a/mysql-test/t/derived.test
+++ b/mysql-test/t/derived.test
@@ -147,7 +147,7 @@ drop table t1;
CREATE TABLE `t1` (
`N` int(11) unsigned NOT NULL default '0',
`M` tinyint(1) default '0',
-) TYPE=MyISAM DEFAULT CHARSET=latin1;
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO `t1` (N, M) VALUES (1, 0),(1, 0),(1, 0),(2, 0),(2, 0),(3, 0);
UPDATE `t1` AS P1 INNER JOIN (SELECT N FROM `t1` GROUP BY N HAVING Count(M) > 1) AS P2 ON P1.N = P2.N SET P1.M = 2;
select * from t1;
@@ -167,7 +167,7 @@ CREATE TABLE t1 (
SORTORDER int(11) NOT NULL auto_increment,
KEY t1_SortIndex (SORTORDER),
KEY t1_IdIndex (OBJECTID)
-) TYPE=MyISAM DEFAULT CHARSET=latin1;
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE t2 (
ID int(11) default NULL,
PARID int(11) default NULL,
diff --git a/mysql-test/t/query_cache.test b/mysql-test/t/query_cache.test
index dba5619b777..5ae2039138d 100644
--- a/mysql-test/t/query_cache.test
+++ b/mysql-test/t/query_cache.test
@@ -466,8 +466,10 @@ select * from t1 where id=2;
create table t1 (word char(20) not null);
select * from t1;
show status like "Qcache_queries_in_cache";
-load data infile '../../std_data/words.dat' into table t1;
+--replace_result $MYSQL_TEST_DIR TEST_DIR
+eval load data infile '$MYSQL_TEST_DIR/std_data/words.dat' into table t1;
show status like "Qcache_queries_in_cache";
+select count(*) from t1;
drop table t1;
#
@@ -476,7 +478,9 @@ drop table t1;
create table t1 (a int);
insert into t1 values (1),(2),(3);
show status like "Qcache_queries_in_cache";
-select * from t1 into outfile "query_caceh.out.file";
+select * from t1 into outfile "query_cache.out.file";
+--error 1086
+select * from t1 into outfile "query_cache.out.file";
select * from t1 limit 1 into dumpfile "query_cache.dump.file";
show status like "Qcache_queries_in_cache";
drop table t1;
diff --git a/mysql-test/t/rpl_until.test b/mysql-test/t/rpl_until.test
index 4508fbea194..937a8c03f99 100644
--- a/mysql-test/t/rpl_until.test
+++ b/mysql-test/t/rpl_until.test
@@ -59,10 +59,11 @@ stop slave;
# this should stop immideately
start slave until master_log_file='master-bin.000001', master_log_pos=561;
---real-sleep 2;
+# 2 is not enough when running with valgrind
+--real-sleep 4;
# here the sql slave thread should be stopped
--replace_result $MASTER_MYPORT MASTER_MYPORT bin.000005 bin.000004 bin.000006 bin.000004 bin.000007 bin.000004
---replace_column 1 # 9 # 23 # 33 #
+--replace_column 1 # 9 # 12 # 23 # 33 #
show slave status;
#testing various error conditions
diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test
index c4392186055..6c53c70c9a0 100644
--- a/mysql-test/t/subselect.test
+++ b/mysql-test/t/subselect.test
@@ -1026,52 +1026,26 @@ drop table t1;
# Bug 2479
#
-CREATE TABLE t1 (
-id int(11) NOT NULL auto_increment,
-ts timestamp NOT NULL,
-id_cns tinyint(3) unsigned NOT NULL default '0',
-id_desc_nota int(11) NOT NULL default '1',
-id_publ_uff int(11) NOT NULL default '0',
-tipo enum('','UNO','DUE') NOT NULL default '',
-f_aggiunte set('TRE','TRETRE','QUATTRO','CINQUE','SEI','SETTE') NOT NULL
-default '',
-anno_dep smallint(4) unsigned zerofill NOT NULL default '0000',
-data_dep smallint(4) unsigned zerofill NOT NULL default '0000',
-particolare mediumint(8) unsigned NOT NULL default '0',
-generale mediumint(8) unsigned NOT NULL default '0',
-bis tinyint(3) unsigned NOT NULL default '0',
-PRIMARY KEY(id),
-UNIQUE KEY idx_cns_gen_anno (anno_dep,id_cns,generale,particolare),
-UNIQUE KEY idx_cns_par_anno (id_cns,anno_dep,tipo,particolare,bis)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1 PACK_KEYS=1;
-
-INSERT INTO t1 (id, ts, id_cns, id_desc_nota, id_publ_uff, tipo, f_aggiunte,
-anno_dep, data_dep, particolare, generale, bis) VALUES
-(NULL, NULL, 16, 29, 622, 'UNO', '', 1987, 1218, 2048, 9681, 0),
-(NULL, NULL, 50, 23, 1717, 'UNO', '', 1987, 1126, 1536, 13987, 0),
-(NULL, NULL, 16, 123, 123, 'UNO', '', 1987, 1221, 2432, 14594, 0),
-(NULL, NULL, 16, 124, 124, 'UNO', '', 1987, 1201, 1792, 13422, 0),
-(NULL, NULL, 16, 125, 125, 'UNO', '', 1987, 0723, 1025, 10240, 0),
-(NULL, NULL, 16, 126, 126, 'UNO', '', 1987, 1204, 1026, 7089, 0);
-
-CREATE TABLE t2 (
-id tinyint(3) unsigned NOT NULL auto_increment,
-descr varchar(40) NOT NULL default '',
-f_servizi set('UNO','DUE') NOT NULL default '',
-data_uno_min int(8) unsigned NOT NULL default '0',
-data_due_min int(8) unsigned NOT NULL default '0',
-max_anno_dep smallint(6) unsigned NOT NULL default '0',
-data_agg int(8) unsigned NOT NULL default '0',
-PRIMARY KEY (id)
+CREATE TABLE `t1` (
+ `id` int(11) NOT NULL auto_increment,
+ `id_cns` tinyint(3) unsigned NOT NULL default '0',
+ `tipo` enum('','UNO','DUE') NOT NULL default '',
+ `anno_dep` smallint(4) unsigned zerofill NOT NULL default '0000',
+ `particolare` mediumint(8) unsigned NOT NULL default '0',
+ `generale` mediumint(8) unsigned NOT NULL default '0',
+ `bis` tinyint(3) unsigned NOT NULL default '0',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `idx_cns_gen_anno` (`anno_dep`,`id_cns`,`generale`,`particolare`),
+ UNIQUE KEY `idx_cns_par_anno` (`id_cns`,`anno_dep`,`tipo`,`particolare`,`bis`)
);
+INSERT INTO `t1` VALUES (1,16,'UNO',1987,2048,9681,0),(2,50,'UNO',1987,1536,13987,0),(3,16,'UNO',1987,2432,14594,0),(4,16,'UNO',1987,1792,13422,0),(5,16,'UNO',1987,1025,10240,0),(6,16,'UNO',1987,1026,7089,0);
+CREATE TABLE `t2` (
+ `id` tinyint(3) unsigned NOT NULL auto_increment,
+ `max_anno_dep` smallint(6) unsigned NOT NULL default '0',
+ PRIMARY KEY (`id`)
+);
+INSERT INTO `t2` VALUES (16,1987),(50,1990),(51,1990);
-INSERT INTO t2 (id, descr, f_servizi, data_uno_min, data_due_min,
-max_anno_dep, data_agg) VALUES
-(16, 'C_UNO', 'UNO,DUE', 19000000, 30000000, 1987, 0),
-(50, 'C_TRE', 'UNO', 19000000, 30000000, 1990, 0);
-
-SELECT cns.max_anno_dep = (SELECT s.anno_dep FROM t1 AS s WHERE
-s.id_cns = cns.id ORDER BY s.anno_dep DESC LIMIT 1) AS PIPPO FROM
-t2 AS cns;
+SELECT cns.id, cns.max_anno_dep, cns.max_anno_dep = (SELECT s.anno_dep FROM t1 AS s WHERE s.id_cns = cns.id ORDER BY s.anno_dep DESC LIMIT 1) AS PIPPO FROM t2 AS cns;
DROP TABLE t1, t2;
diff --git a/sql/field.cc b/sql/field.cc
index 9f25b770ab0..f337f4ca46c 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -4058,10 +4058,12 @@ void Field_datetime::sql_type(String &res) const
int Field_string::store(const char *from,uint length,CHARSET_INFO *cs)
{
int error= 0;
+ uint32 not_used;
char buff[80];
String tmpstr(buff,sizeof(buff), &my_charset_bin);
+
/* Convert character set if nesessary */
- if (String::needs_conversion(from, length, cs, field_charset))
+ if (String::needs_conversion(length, cs, field_charset, &not_used))
{
tmpstr.copy(from, length, cs, field_charset);
from= tmpstr.ptr();
@@ -4246,10 +4248,12 @@ uint Field_string::max_packed_col_length(uint max_length)
int Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs)
{
int error= 0;
+ uint32 not_used;
char buff[80];
String tmpstr(buff,sizeof(buff), &my_charset_bin);
+
/* Convert character set if nesessary */
- if (String::needs_conversion(from, length, cs, field_charset))
+ if (String::needs_conversion(length, cs, field_charset, &not_used))
{
tmpstr.copy(from, length, cs, field_charset);
from= tmpstr.ptr();
@@ -4565,10 +4569,11 @@ int Field_blob::store(const char *from,uint length,CHARSET_INFO *cs)
bool was_conversion;
char buff[80];
String tmpstr(buff,sizeof(buff), &my_charset_bin);
+ uint32 not_used;
/* Convert character set if nesessary */
- if ((was_conversion= String::needs_conversion(from, length,
- cs, field_charset)))
+ if ((was_conversion= String::needs_conversion(length, cs, field_charset,
+ &not_used)))
{
tmpstr.copy(from, length, cs, field_charset);
from= tmpstr.ptr();
@@ -5079,10 +5084,12 @@ void Field_enum::store_type(ulonglong value)
int Field_enum::store(const char *from,uint length,CHARSET_INFO *cs)
{
int err= 0;
+ uint32 not_used;
char buff[80];
String tmpstr(buff,sizeof(buff), &my_charset_bin);
+
/* Convert character set if nesessary */
- if (String::needs_conversion(from, length, cs, field_charset))
+ if (String::needs_conversion(length, cs, field_charset, &not_used))
{
tmpstr.copy(from, length, cs, field_charset);
from= tmpstr.ptr();
@@ -5259,11 +5266,12 @@ int Field_set::store(const char *from,uint length,CHARSET_INFO *cs)
int err= 0;
char *not_used;
uint not_used2;
+ uint32 not_used_offset;
char buff[80];
String tmpstr(buff,sizeof(buff), &my_charset_bin);
/* Convert character set if nesessary */
- if (String::needs_conversion(from, length, cs, field_charset))
+ if (String::needs_conversion(length, cs, field_charset, &not_used_offset))
{
tmpstr.copy(from, length, cs, field_charset);
from= tmpstr.ptr();
diff --git a/sql/ha_heap.cc b/sql/ha_heap.cc
index ae0267b98f3..c1228cbd319 100644
--- a/sql/ha_heap.cc
+++ b/sql/ha_heap.cc
@@ -40,6 +40,7 @@ int ha_heap::open(const char *name, int mode, uint test_if_locked)
if (!create(name, table, &create_info))
file= heap_open(name, mode);
}
+ ref_length= sizeof(HEAP_PTR);
return (file ? 0 : 1);
}
@@ -335,7 +336,6 @@ int ha_heap::create(const char *name, TABLE *table_arg,
my_free((gptr) keydef, MYF(0));
if (file)
info(HA_STATUS_NO_LOCK | HA_STATUS_CONST | HA_STATUS_VARIABLE);
- ref_length= sizeof(HEAP_PTR);
return (error);
}
diff --git a/sql/item_func.cc b/sql/item_func.cc
index efeb0d456ef..b1378784f92 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -1068,9 +1068,8 @@ String *Item_func_min_max::val_str(String *str)
}
}
}
- if (!res) // If NULL
- return 0;
- res->set_charset(collation.collation);
+ if (res) // If !NULL
+ res->set_charset(collation.collation);
return res;
}
case ROW_RESULT:
diff --git a/sql/item_func.h b/sql/item_func.h
index be20a9b4fc7..30f817d133b 100644
--- a/sql/item_func.h
+++ b/sql/item_func.h
@@ -211,20 +211,28 @@ class Item_func_signed :public Item_int_func
{
public:
Item_func_signed(Item *a) :Item_int_func(a) {}
- double val() { null_value=args[0]->null_value; return args[0]->val(); }
- longlong val_int() { null_value=args[0]->null_value; return args[0]->val_int(); }
+ double val()
+ {
+ double tmp= args[0]->val();
+ null_value= args[0]->null_value;
+ return tmp;
+ }
+ longlong val_int()
+ {
+ longlong tmp= args[0]->val_int();
+ null_value= args[0]->null_value;
+ return tmp;
+ }
void fix_length_and_dec()
{ max_length=args[0]->max_length; unsigned_flag=0; }
void print(String *str);
};
-class Item_func_unsigned :public Item_int_func
+class Item_func_unsigned :public Item_func_signed
{
public:
- Item_func_unsigned(Item *a) :Item_int_func(a) {}
- double val() { null_value=args[0]->null_value; return args[0]->val(); }
- longlong val_int() { null_value=args[0]->null_value; return args[0]->val_int(); }
+ Item_func_unsigned(Item *a) :Item_func_signed(a) {}
void fix_length_and_dec()
{ max_length=args[0]->max_length; unsigned_flag=1; }
void print(String *str);
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index f5922d03868..fd1222d5f1a 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -2126,14 +2126,12 @@ void Item_func_conv_charset::print(String *str)
String *Item_func_conv_charset3::val_str(String *str)
{
- my_wc_t wc;
- int cnvres;
- const uchar *s, *se;
- uchar *d, *d0, *de;
- uint32 dmaxlen;
+ char cs1[30], cs2[30];
+ String to_cs_buff(cs1, sizeof(cs1), default_charset_info);
+ String from_cs_buff(cs2, sizeof(cs2), default_charset_info);
String *arg= args[0]->val_str(str);
- String *to_cs= args[1]->val_str(str);
- String *from_cs= args[2]->val_str(str);
+ String *to_cs= args[1]->val_str(&to_cs_buff);
+ String *from_cs= args[2]->val_str(&from_cs_buff);
CHARSET_INFO *from_charset;
CHARSET_INFO *to_charset;
@@ -2143,51 +2141,17 @@ String *Item_func_conv_charset3::val_str(String *str)
!(from_charset=get_charset_by_name(from_cs->ptr(), MYF(MY_WME))) ||
!(to_charset=get_charset_by_name(to_cs->ptr(), MYF(MY_WME))))
{
- null_value=1;
+ null_value= 1;
return 0;
}
- s=(const uchar*)arg->ptr();
- se=s+arg->length();
-
- dmaxlen=arg->length()*to_charset->mbmaxlen+1;
- str->alloc(dmaxlen);
- d0=d=(unsigned char*)str->ptr();
- de=d+dmaxlen;
-
- while (1)
+ if (str_value.copy(arg->ptr(), arg->length(), from_charset, to_charset))
{
- cnvres=from_charset->cset->mb_wc(from_charset,&wc,s,se);
- if (cnvres>0)
- {
- s+=cnvres;
- }
- else if (cnvres==MY_CS_ILSEQ)
- {
- s++;
- wc='?';
- }
- else
- break;
-
-outp:
- cnvres=to_charset->cset->wc_mb(to_charset,wc,d,de);
- if (cnvres>0)
- {
- d+=cnvres;
- }
- else if (cnvres==MY_CS_ILUNI && wc!='?')
- {
- wc='?';
- goto outp;
- }
- else
- break;
- };
-
- str->length((uint32) (d-d0));
- str->set_charset(to_charset);
- return str;
+ null_value= 1;
+ return 0;
+ }
+ null_value= 0;
+ return &str_value;
}
diff --git a/sql/item_sum.cc b/sql/item_sum.cc
index e01f9db3463..10b50fa5b3b 100644
--- a/sql/item_sum.cc
+++ b/sql/item_sum.cc
@@ -1092,15 +1092,21 @@ void Item_sum_count_distinct::cleanup()
if (!original)
{
if (table)
+ {
free_tmp_table(current_thd, table);
+ table= 0;
+ }
delete tmp_table_param;
+ tmp_table_param= 0;
if (use_tree)
+ {
delete_tree(tree);
- table= 0;
- use_tree= 0;
+ use_tree= 0;
+ }
}
}
+
bool Item_sum_count_distinct::fix_fields(THD *thd, TABLE_LIST *tables,
Item **ref)
{
@@ -1674,13 +1680,21 @@ void Item_func_group_concat::cleanup()
{
THD *thd= current_thd;
if (table)
+ {
free_tmp_table(thd, table);
+ table= 0;
+ }
delete tmp_table_param;
+ tmp_table_param= 0;
if (tree_mode)
+ {
+ tree_mode= 0;
delete_tree(tree);
+ }
}
}
+
Item_func_group_concat::~Item_func_group_concat()
{
/*
diff --git a/sql/item_sum.h b/sql/item_sum.h
index dc84e4d4ab7..bb03f029997 100644
--- a/sql/item_sum.h
+++ b/sql/item_sum.h
@@ -397,12 +397,13 @@ class Item_sum_hybrid :public Item_sum
public:
Item_sum_hybrid(Item *item_par,int sign)
- :Item_sum(item_par), hybrid_type(INT_RESULT), cmp_sign(sign),
- used_table_cache(~(table_map) 0),
+ :Item_sum(item_par), sum(0.0), sum_int(0),
+ hybrid_type(INT_RESULT), hybrid_field_type(FIELD_TYPE_LONGLONG),
+ cmp_sign(sign), used_table_cache(~(table_map) 0),
cmp_charset(&my_charset_bin)
{}
Item_sum_hybrid(THD *thd, Item_sum_hybrid *item):
- Item_sum(thd, item), value(item->value), tmp_value(item->tmp_value),
+ Item_sum(thd, item), value(item->value),
sum(item->sum), sum_int(item->sum_int), hybrid_type(item->hybrid_type),
hybrid_field_type(item->hybrid_field_type),cmp_sign(item->cmp_sign),
used_table_cache(item->used_table_cache), cmp_charset(item->cmp_charset) {}
diff --git a/sql/opt_range.cc b/sql/opt_range.cc
index 2647a0ae818..4c9f3700ef1 100644
--- a/sql/opt_range.cc
+++ b/sql/opt_range.cc
@@ -1005,7 +1005,7 @@ get_mm_leaf(PARAM *param, COND *conf_func, Field *field, KEY_PART *key_part,
}
/*
- We can't use an index when comparing stings of
+ We can't use an index when comparing strings of
different collations
*/
if (field->result_type() == STRING_RESULT &&
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index fc042ae7918..cbac11ac42e 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -744,7 +744,7 @@ static File create_file(THD *thd, char *path, sql_exchange *exchange,
if (!access(path, F_OK))
{
my_error(ER_FILE_EXISTS_ERROR, MYF(0), exchange->file_name);
- return 1;
+ return -1;
}
/* Create the file world readable */
if ((file= my_create(path, 0666, O_WRONLY, MYF(MY_WME))) < 0)
diff --git a/sql/sql_class.h b/sql/sql_class.h
index 51dc8270d09..b3135202ad6 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -993,10 +993,6 @@ public:
class select_dump :public select_to_file {
- sql_exchange *exchange;
- File file;
- IO_CACHE cache;
- ha_rows row_count;
public:
select_dump(sql_exchange *ex) :select_to_file(ex) {}
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc
index de0d0c8aca8..9b8ef37757c 100644
--- a/sql/sql_prepare.cc
+++ b/sql/sql_prepare.cc
@@ -1005,8 +1005,10 @@ void mysql_stmt_execute(THD *thd, char *packet)
sl->where= sl->prep_where->copy_andor_structure(thd);
DBUG_ASSERT(sl->join == 0);
ORDER *order;
+ /* Fix GROUP list */
for (order=(ORDER *)sl->group_list.first ; order ; order=order->next)
order->item= (Item **)(order+1);
+ /* Fix ORDER list */
for (order=(ORDER *)sl->order_list.first ; order ; order=order->next)
order->item= (Item **)(order+1);
}
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 5f6167f2cd1..4da2522bd3f 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -519,8 +519,7 @@ int mysqld_extend_show_tables(THD *thd,const char *db,const char *wild)
protocol->store_null();
// Send error to Comment field
protocol->store(thd->net.last_error, system_charset_info);
- thd->net.last_error[0]=0;
- thd->net.last_errno= 0;
+ thd->clear_error();
}
else
{
diff --git a/sql/sql_string.cc b/sql/sql_string.cc
index 7f26a0febda..cbee67c0a4a 100644
--- a/sql/sql_string.cc
+++ b/sql/sql_string.cc
@@ -230,68 +230,86 @@ bool String::copy(const char *str,uint32 arg_length, CHARSET_INFO *cs)
/*
- Checks that the source string can be just copied
- to the destination string without conversion.
- If either character set conversion or adding leading
- zeros (e.g. for UCS-2) must be done then return
- value is TRUE else FALSE.
+ Checks that the source string can be just copied to the destination string
+ without conversion.
+
+ SYNPOSIS
+
+ needs_conversion()
+ arg_length Length of string to copy.
+ from_cs Character set to copy from
+ to_cs Character set to copy to
+ uint32 *offset Returns number of unaligned characters.
+
+ RETURN
+ 0 No conversion needed
+ 1 Either character set conversion or adding leading zeros
+ (e.g. for UCS-2) must be done
*/
-bool String::needs_conversion(const char *str, uint32 arg_length,
- CHARSET_INFO *from_cs,
- CHARSET_INFO *to_cs)
+
+bool String::needs_conversion(uint32 arg_length,
+ CHARSET_INFO *from_cs,
+ CHARSET_INFO *to_cs,
+ uint32 *offset)
{
+ *offset= 0;
if ((to_cs == &my_charset_bin) ||
(to_cs == from_cs) ||
my_charset_same(from_cs, to_cs) ||
- ((from_cs == &my_charset_bin) && (!(arg_length % to_cs->mbminlen))))
+ ((from_cs == &my_charset_bin) &&
+ (!(*offset=(arg_length % to_cs->mbminlen)))))
return FALSE;
-
return TRUE;
}
+
/*
-** For real multi-byte, ascii incompatible charactser sets,
-** like UCS-2, add leading zeros if we have an incomplete character.
-** Thus,
-** SELECT _ucs2 0xAA
-** will automatically be converted into
-** SELECT _ucs2 0x00AA
+ Copy a multi-byte character sets with adding leading zeros.
+
+ SYNOPSIS
+
+ copy_aligned()
+ str String to copy
+ arg_length Length of string. This should NOT be dividable with
+ cs->mbminlen.
+ offset arg_length % cs->mb_minlength
+ cs Character set for 'str'
+
+ NOTES
+ For real multi-byte, ascii incompatible charactser sets,
+ like UCS-2, add leading zeros if we have an incomplete character.
+ Thus,
+ SELECT _ucs2 0xAA
+ will automatically be converted into
+ SELECT _ucs2 0x00AA
+
+ RETURN
+ 0 ok
+ 1 error
*/
-bool String::copy_aligned(const char *str,uint32 arg_length,
+bool String::copy_aligned(const char *str,uint32 arg_length, uint32 offset,
CHARSET_INFO *cs)
{
/* How many bytes are in incomplete character */
- uint32 offs= (arg_length % cs->mbminlen);
+ offset= cs->mbmaxlen - offset; /* How many zeros we should prepend */
+ DBUG_ASSERT(offset && offset != cs->mbmaxlen);
- if (!offs) /* All characters are complete, just copy */
- {
- copy(str, arg_length, cs);
- return FALSE;
- }
-
- offs= cs->mbmaxlen - offs; /* How many zeros we should prepend */
- uint32 aligned_length= arg_length + offs;
+ uint32 aligned_length= arg_length + offset;
if (alloc(aligned_length))
return TRUE;
/*
- Probably this condition is not really necessary
- because if aligned_length is 0 then offs is 0 too
- and we'll return after calling set().
+ Note, this is only safe for little-endian UCS-2.
+ If we add big-endian UCS-2 sometimes, this code
+ will be more complicated. But it's OK for now.
*/
- if ((str_length= aligned_length))
- {
- /*
- Note, this is only safe for little-endian UCS-2.
- If we add big-endian UCS-2 sometimes, this code
- will be more complicated. But it's OK for now.
- */
- bzero((char*)Ptr, offs);
- memcpy(Ptr + offs, str, arg_length);
- }
+ bzero((char*) Ptr, offset);
+ memcpy(Ptr + offset, str, arg_length);
Ptr[aligned_length]=0;
- str_charset=cs;
+ /* str_length is always >= 0 as arg_length is != 0 */
+ str_length= aligned_length;
+ str_charset= cs;
return FALSE;
}
@@ -300,14 +318,14 @@ bool String::set_or_copy_aligned(const char *str,uint32 arg_length,
CHARSET_INFO *cs)
{
/* How many bytes are in incomplete character */
- uint32 offs= (arg_length % cs->mbminlen);
+ uint32 offset= (arg_length % cs->mbminlen);
- if (!offs) /* All characters are complete, just copy */
+ if (!offset) /* All characters are complete, just copy */
{
set(str, arg_length, cs);
return FALSE;
}
- return copy_aligned(str, arg_length, cs);
+ return copy_aligned(str, arg_length, offset, cs);
}
/* Copy with charset convertion */
@@ -315,14 +333,11 @@ bool String::set_or_copy_aligned(const char *str,uint32 arg_length,
bool String::copy(const char *str, uint32 arg_length,
CHARSET_INFO *from_cs, CHARSET_INFO *to_cs)
{
- if (!needs_conversion(str, arg_length, from_cs, to_cs))
- {
+ uint32 offset;
+ if (!needs_conversion(arg_length, from_cs, to_cs, &offset))
return copy(str, arg_length, to_cs);
- }
- if ((from_cs == &my_charset_bin) && (arg_length % to_cs->mbminlen))
- {
- return copy_aligned(str, arg_length, to_cs);
- }
+ if ((from_cs == &my_charset_bin) && offset)
+ return copy_aligned(str, arg_length, offset, to_cs);
uint32 new_length= to_cs->mbmaxlen*arg_length;
if (alloc(new_length))
@@ -744,7 +759,8 @@ copy_and_convert(char *to, uint32 to_length, CHARSET_INFO *to_cs,
while (1)
{
- if ((cnvres=from_cs->cset->mb_wc(from_cs, &wc, (uchar*) from, from_end)) > 0)
+ if ((cnvres= from_cs->cset->mb_wc(from_cs, &wc, (uchar*) from,
+ from_end)) > 0)
from+= cnvres;
else if (cnvres == MY_CS_ILSEQ)
{
diff --git a/sql/sql_string.h b/sql/sql_string.h
index 9c0900137e3..163156fdfe2 100644
--- a/sql/sql_string.h
+++ b/sql/sql_string.h
@@ -183,9 +183,11 @@ public:
bool copy(); // Alloc string if not alloced
bool copy(const String &s); // Allocate new string
bool copy(const char *s,uint32 arg_length, CHARSET_INFO *cs); // Allocate new string
- static bool needs_conversion(const char *s, uint32 arg_length,
- CHARSET_INFO *cs_from, CHARSET_INFO *cs_to);
- bool copy_aligned(const char *s, uint32 arg_length, CHARSET_INFO *cs);
+ static bool needs_conversion(uint32 arg_length,
+ CHARSET_INFO *cs_from, CHARSET_INFO *cs_to,
+ uint32 *offset);
+ bool copy_aligned(const char *s, uint32 arg_length, uint32 offset,
+ CHARSET_INFO *cs);
bool set_or_copy_aligned(const char *s, uint32 arg_length, CHARSET_INFO *cs);
bool copy(const char*s,uint32 arg_length, CHARSET_INFO *csfrom,
CHARSET_INFO *csto);
diff --git a/sql/sql_update.cc b/sql/sql_update.cc
index c6e470fd09f..86593f5ea20 100644
--- a/sql/sql_update.cc
+++ b/sql/sql_update.cc
@@ -482,8 +482,11 @@ int mysql_multi_update(THD *thd,
for (tl= select_lex->get_table_list() ; tl ; tl= tl->next)
{
if (tl->derived && (item_tables & tl->table->map))
+ {
my_printf_error(ER_NON_UPDATABLE_TABLE, ER(ER_NON_UPDATABLE_TABLE),
MYF(0), tl->alias, "UPDATE");
+ DBUG_RETURN(-1);
+ }
}
}
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index f04cc9ec1dc..0dbe8981466 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -918,7 +918,7 @@ create:
&tmp_table_alias :
(LEX_STRING*) 0),
TL_OPTION_UPDATING,
- ((using_update_log)?
+ (using_update_log ?
TL_READ_NO_INSERT:
TL_READ)))
YYABORT;
@@ -2189,10 +2189,9 @@ select_init2:
select_part2:
{
- LEX *lex=Lex;
- SELECT_LEX * sel= lex->current_select;
- if (lex->current_select == &lex->select_lex)
- lex->lock_option= TL_READ; /* Only for global SELECT */
+ LEX *lex= Lex;
+ SELECT_LEX *sel= lex->current_select;
+ lex->lock_option= TL_READ;
if (sel->linkage != UNION_TYPE)
mysql_init_select(lex);
lex->current_select->parsing_place= SELECT_LEX_NODE::SELECT_LIST;
@@ -3060,7 +3059,7 @@ opt_gorder_clause:
| order_clause
{
LEX *lex=Lex;
- lex->gorder_list=
+ lex->gorder_list=
(SQL_LIST*) sql_memdup((char*) &lex->current_select->order_list,
sizeof(st_sql_list));
lex->current_select->order_list.empty();
@@ -3084,16 +3083,16 @@ in_sum_expr:
};
cast_type:
- BINARY { $$=ITEM_CAST_BINARY; }
+ BINARY { $$=ITEM_CAST_BINARY; Lex->charset= NULL; Lex->length= (char*)0; }
| CHAR_SYM opt_len opt_binary { $$=ITEM_CAST_CHAR; }
| NCHAR_SYM opt_len { $$=ITEM_CAST_CHAR; Lex->charset= national_charset_info; }
- | SIGNED_SYM { $$=ITEM_CAST_SIGNED_INT; }
- | SIGNED_SYM INT_SYM { $$=ITEM_CAST_SIGNED_INT; }
- | UNSIGNED { $$=ITEM_CAST_UNSIGNED_INT; }
- | UNSIGNED INT_SYM { $$=ITEM_CAST_UNSIGNED_INT; }
- | DATE_SYM { $$=ITEM_CAST_DATE; }
- | TIME_SYM { $$=ITEM_CAST_TIME; }
- | DATETIME { $$=ITEM_CAST_DATETIME; }
+ | SIGNED_SYM { $$=ITEM_CAST_SIGNED_INT; Lex->charset= NULL; Lex->length= (char*)0; }
+ | SIGNED_SYM INT_SYM { $$=ITEM_CAST_SIGNED_INT; Lex->charset= NULL; Lex->length= (char*)0; }
+ | UNSIGNED { $$=ITEM_CAST_UNSIGNED_INT; Lex->charset= NULL; Lex->length= (char*)0; }
+ | UNSIGNED INT_SYM { $$=ITEM_CAST_UNSIGNED_INT; Lex->charset= NULL; Lex->length= (char*)0; }
+ | DATE_SYM { $$=ITEM_CAST_DATE; Lex->charset= NULL; Lex->length= (char*)0; }
+ | TIME_SYM { $$=ITEM_CAST_TIME; Lex->charset= NULL; Lex->length= (char*)0; }
+ | DATETIME { $$=ITEM_CAST_DATETIME; Lex->charset= NULL; Lex->length= (char*)0; }
;
expr_list:
@@ -3895,6 +3894,7 @@ update:
LEX *lex= Lex;
mysql_init_select(lex);
lex->sql_command= SQLCOM_UPDATE;
+ lex->lock_option= TL_UNLOCK; /* Will be set later */
}
opt_low_priority opt_ignore join_table_list
SET update_list where_clause opt_order_clause delete_limit_clause