summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/hash.h1
-rw-r--r--mysql-test/r/delete.result22
-rw-r--r--mysql-test/r/flush_table.result7
-rw-r--r--mysql-test/r/func_str.result1
-rw-r--r--mysql-test/r/handler.result70
-rw-r--r--mysql-test/r/multi_update.result4
-rw-r--r--mysql-test/r/rename.result2
-rw-r--r--mysql-test/r/select.result1
-rw-r--r--mysql-test/r/show_check.result3
-rw-r--r--mysql-test/t/ctype_latin1_de.test1
-rw-r--r--mysql-test/t/derived.test2
-rw-r--r--mysql-test/t/handler.test30
-rw-r--r--mysql-test/t/multi_update.test11
-rw-r--r--mysql-test/t/range.test3
-rw-r--r--mysql-test/t/rename.test2
-rw-r--r--mysql-test/t/select.test2
-rw-r--r--mysql-test/t/show_check.test4
-rw-r--r--mysql-test/t/type_timestamp.test12
-rw-r--r--sql/item_cmpfunc.cc4
-rw-r--r--sql/item_func.cc2
-rw-r--r--sql/mysql_priv.h1
-rw-r--r--sql/mysqld.cc8
-rw-r--r--sql/sql_acl.cc7
-rw-r--r--sql/sql_base.cc19
-rw-r--r--sql/sql_handler.cc17
-rw-r--r--sql/sql_lex.h2
-rw-r--r--sql/sql_select.cc2
-rw-r--r--sql/sql_show.cc3
-rw-r--r--sql/sql_table.cc35
-rw-r--r--sql/sql_update.cc37
-rw-r--r--sql/sql_yacc.yy2
31 files changed, 193 insertions, 124 deletions
diff --git a/include/hash.h b/include/hash.h
index 6e6db27cd40..cd7210a290c 100644
--- a/include/hash.h
+++ b/include/hash.h
@@ -57,6 +57,7 @@ my_bool hash_update(HASH *hash,byte *record,byte *old_key,uint old_key_length);
void hash_replace(HASH *hash, uint idx, byte *new_row);
my_bool hash_check(HASH *hash); /* Only in debug library */
+#define hash_clear(H) bzero((char*) (H),sizeof(*(H)))
#define hash_inited(H) ((H)->array.buffer != 0)
#ifdef __cplusplus
diff --git a/mysql-test/r/delete.result b/mysql-test/r/delete.result
index 48cfa47b75c..5575ee1bf98 100644
--- a/mysql-test/r/delete.result
+++ b/mysql-test/r/delete.result
@@ -58,6 +58,17 @@ select count(*) from t1;
count(*)
0
drop table t1;
+create table t1 (a int not null auto_increment primary key, b char(32));
+insert into t1 (b) values ('apple'), ('apple');
+select * from t1;
+a b
+1 apple
+2 apple
+delete t1 from t1, t1 as t2 where t1.b = t2.b and t1.a > t2.a;
+select * from t1;
+a b
+1 apple
+drop table t1;
create table t11 (a int NOT NULL, b int, primary key (a));
create table t12 (a int NOT NULL, b int, primary key (a));
create table t2 (a int NOT NULL, b int, primary key (a));
@@ -130,14 +141,3 @@ select * from t1;
a b
7 7
drop table t1;
-create table t1 (a int not null auto_increment primary key, b char(32));
-insert into t1 (b) values ('apple'), ('apple');
-select * from t1;
-a b
-1 apple
-2 apple
-delete t1 from t1, t1 as t2 where t1.b = t2.b and t1.a > t2.a;
-select * from t1;
-a b
-1 apple
-drop table t1;
diff --git a/mysql-test/r/flush_table.result b/mysql-test/r/flush_table.result
index 7d2e9ab0b8d..2ef4ab5b52b 100644
--- a/mysql-test/r/flush_table.result
+++ b/mysql-test/r/flush_table.result
@@ -42,11 +42,11 @@ table_id
test.t2
handler t1 open as a1;
-Not unique table/alias: 'a1'
+ERROR 42000: Not unique table/alias: 'a1'
handler t1 open as a2;
-Not unique table/alias: 'a2'
+ERROR 42000: Not unique table/alias: 'a2'
handler t2 open;
-Not unique table/alias: 't2'
+ERROR 42000: Not unique table/alias: 't2'
handler a1 read first limit 9;
table_id
test.t1
@@ -74,7 +74,6 @@ test.t2
flush table t2;
handler t2 close;
-ERROR 42S02: Unknown table 't2' in HANDLER
drop table t1;
drop table t2;
create table t1(table_id char(20) primary key);
diff --git a/mysql-test/r/func_str.result b/mysql-test/r/func_str.result
index ab99b2dcbdd..4a3a70274fd 100644
--- a/mysql-test/r/func_str.result
+++ b/mysql-test/r/func_str.result
@@ -321,6 +321,7 @@ trim(trailing 'foo' from 'foo')
select trim(leading 'foo' from 'foo');
trim(leading 'foo' from 'foo')
+
select 1=_latin1'1';
1=_latin1'1'
1
diff --git a/mysql-test/r/handler.result b/mysql-test/r/handler.result
index dcbf558ac3f..072d4582cbc 100644
--- a/mysql-test/r/handler.result
+++ b/mysql-test/r/handler.result
@@ -230,40 +230,36 @@ create table t1(table_id char(20) primary key);
insert into t1 values ('test.t1');
insert into t1 values ('');
handler t1 open;
-Not unique table/alias: 't1'
+ERROR 42000: Not unique table/alias: 't1'
use test;
handler test.t1 read first limit 9;
-Unknown table 'test.t1' in HANDLER
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'read first limit 9' at line 1
handler test_test.t1 read first limit 9;
-table_id
-test_test.t1
-
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'read first limit 9' at line 1
handler t1 read first limit 9;
table_id
test_test.t1
handler test_test.t2 read first limit 9;
-table_id
-test_test.t2
-
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'read first limit 9' at line 1
handler t2 read first limit 9;
table_id
test_test.t2
handler test_test.t1 close;
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'close' at line 1
handler t1 close;
-Unknown table 't1' in HANDLER
drop table test_test.t1;
handler test_test.t2 close;
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'close' at line 1
handler t2 close;
-Unknown table 't2' in HANDLER
drop table test_test.t2;
drop database test_test;
use test;
handler test.t1 close;
-Unknown table 'test.t1' in HANDLER
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'close' at line 1
handler t1 close;
-Unknown table 't1' in HANDLER
+ERROR 42S02: Unknown table 't1' in HANDLER
drop table test.t1;
drop database if exists test_test;
drop table if exists t1;
@@ -291,20 +287,20 @@ insert into t1 values ('t1');
insert into t2 values ('t2');
insert into t3 values ('t3');
handler t1 open;
-Not unique table/alias: 't1'
+ERROR 42000: Not unique table/alias: 't1'
handler t2 open t1;
-Not unique table/alias: 't1'
+ERROR 42000: Not unique table/alias: 't1'
handler t3 open t1;
-Not unique table/alias: 't1'
+ERROR 42000: Not unique table/alias: 't1'
handler t1 read first limit 9;
c1
test_test.t1
handler test.t1 close;
-Unknown table 'test.t1' in HANDLER
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'close' at line 1
handler test.t1 open h1;
-Not unique table/alias: 'h1'
+ERROR 42000: Not unique table/alias: 'h1'
handler test_test.t1 open h1;
-Not unique table/alias: 'h1'
+ERROR 42000: Not unique table/alias: 'h1'
handler test_test.t3 open h3;
handler test.t1 open h2;
handler t1 read first limit 9;
@@ -319,24 +315,24 @@ t1
handler h3 read first limit 9;
c1
test_test.t3
-handler test.h2 read first limit 9;
+handler h2 read first limit 9;
c1
t1
handler test.h1 close;
-Unknown table 'test.h1' in HANDLER
-handler test_test.t1 close;
-handler test_test.h1 close;
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'close' at line 1
+handler t1 close;
+handler h1 close;
handler h2 close;
handler t1 read first limit 9;
-Unknown table 't1' in HANDLER
+ERROR 42S02: Unknown table 't1' in HANDLER
handler h1 read first limit 9;
-Unknown table 'h1' in HANDLER
+ERROR 42S02: Unknown table 'h1' in HANDLER
handler h2 read first limit 9;
-Unknown table 'h2' in HANDLER
+ERROR 42S02: Unknown table 'h2' in HANDLER
handler h3 read first limit 9;
c1
test_test.t3
-handler test_test.h3 read first limit 9;
+handler h3 read first limit 9;
c1
test_test.t3
use test_test;
@@ -344,8 +340,8 @@ handler h3 read first limit 9;
c1
test_test.t3
handler test.h3 read first limit 9;
-Unknown table 'test.h3' in HANDLER
-handler test_test.h3 close;
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'read first limit 9' at line 1
+handler h3 close;
use test;
drop table t3;
drop table t2;
@@ -383,7 +379,7 @@ c1
t5
alter table t1 engine=MyISAM;
handler h1 read first limit 9;
-Unknown table 'h1' in HANDLER
+ERROR 42S02: Unknown table 'h1' in HANDLER
handler h2 read first limit 9;
c1
t2
@@ -398,7 +394,7 @@ c1
t5
alter table t5 engine=MyISAM;
handler h1 read first limit 9;
-Unknown table 'h1' in HANDLER
+ERROR 42S02: Unknown table 'h1' in HANDLER
handler h2 read first limit 9;
c1
t2
@@ -409,20 +405,20 @@ handler h4 read first limit 9;
c1
t4
handler h5 read first limit 9;
-Unknown table 'h5' in HANDLER
+ERROR 42S02: Unknown table 'h5' in HANDLER
alter table t3 engine=MyISAM;
handler h1 read first limit 9;
-Unknown table 'h1' in HANDLER
+ERROR 42S02: Unknown table 'h1' in HANDLER
handler h2 read first limit 9;
c1
t2
handler h3 read first limit 9;
-Unknown table 'h3' in HANDLER
+ERROR 42S02: Unknown table 'h3' in HANDLER
handler h4 read first limit 9;
c1
t4
handler h5 read first limit 9;
-Unknown table 'h5' in HANDLER
+ERROR 42S02: Unknown table 'h5' in HANDLER
handler h2 close;
handler h4 close;
handler t1 open as h1_1;
@@ -439,11 +435,11 @@ c1
t1
alter table t1 engine=MyISAM;
handler h1_1 read first limit 9;
-Unknown table 'h1_1' in HANDLER
+ERROR 42S02: Unknown table 'h1_1' in HANDLER
handler h1_2 read first limit 9;
-Unknown table 'h1_2' in HANDLER
+ERROR 42S02: Unknown table 'h1_2' in HANDLER
handler h1_3 read first limit 9;
-Unknown table 'h1_3' in HANDLER
+ERROR 42S02: Unknown table 'h1_3' in HANDLER
drop table t1;
drop table t2;
drop table t3;
diff --git a/mysql-test/r/multi_update.result b/mysql-test/r/multi_update.result
index 780ceb36ad6..045a1b05e47 100644
--- a/mysql-test/r/multi_update.result
+++ b/mysql-test/r/multi_update.result
@@ -1,5 +1,8 @@
drop table if exists t1,t2,t3;
drop database if exists mysqltest;
+revoke all privileges on mysqltest.t1 from mysqltest_1@localhost;
+revoke all privileges on mysqltest.* from mysqltest_1@localhost;
+delete from mysql.user where user=_binary'mysqltest_1';
create table t1(id1 int not null auto_increment primary key, t char(12));
create table t2(id2 int not null, t char(12));
create table t3(id3 int not null, t char(12), index(id3));
@@ -152,7 +155,6 @@ ERROR HY000: Table 't2' was locked with a READ lock and can't be updated
UPDATE t1,t2 SET t1.d=t2.d,t2.d=30 WHERE t1.n=t2.n;
ERROR HY000: Table 't2' was locked with a READ lock and can't be updated
UPDATE t1,t2 SET t1.d=t2.d WHERE t1.n=t2.n;
-ERROR HY000: Table 't2' was locked with a READ lock and can't be updated
unlock tables;
LOCK TABLES t1 write, t2 write;
UPDATE t1,t2 SET t1.d=t2.d WHERE t1.n=t2.n;
diff --git a/mysql-test/r/rename.result b/mysql-test/r/rename.result
index ec36f015412..76c0f4422fe 100644
--- a/mysql-test/r/rename.result
+++ b/mysql-test/r/rename.result
@@ -1,5 +1,5 @@
drop table if exists t0,t1,t2,t3,t4;
-drop table if exists t0,t5,t6,t7,t8,t9;
+drop table if exists t0,t5,t6,t7,t8,t9,t1_1,t1_2,t9_1,t9_2;
create table t0 SELECT 1,"table 1";
create table t2 SELECT 2,"table 2";
create table t3 SELECT 3,"table 3";
diff --git a/mysql-test/r/select.result b/mysql-test/r/select.result
index f0618c0f153..ba0a80331b1 100644
--- a/mysql-test/r/select.result
+++ b/mysql-test/r/select.result
@@ -1,4 +1,5 @@
drop table if exists t1,t2,t3,t4;
+drop table if exists t1_1,t1_2,t9_1,t9_2;
CREATE TABLE t1 (
Period smallint(4) unsigned zerofill DEFAULT '0000' NOT NULL,
Varor_period smallint(4) unsigned DEFAULT '0' NOT NULL
diff --git a/mysql-test/r/show_check.result b/mysql-test/r/show_check.result
index 8b52e6efedc..8256c8d692a 100644
--- a/mysql-test/r/show_check.result
+++ b/mysql-test/r/show_check.result
@@ -1,5 +1,8 @@
drop table if exists t1,t2;
drop database if exists mysqltest;
+delete from mysql.user where user='mysqltest_1' || user='mysqltest_2' || user='mysqltest_3';
+delete from mysql.db where user='mysqltest_1' || user='mysqltest_2' || user='mysqltest_3';
+flush privileges;
create table t1 (a int not null primary key, b int not null,c int not null, key(b,c));
insert into t1 values (1,2,2),(2,2,3),(3,2,4),(4,2,4);
check table t1 fast;
diff --git a/mysql-test/t/ctype_latin1_de.test b/mysql-test/t/ctype_latin1_de.test
index 472a3db648e..1c9576c1c56 100644
--- a/mysql-test/t/ctype_latin1_de.test
+++ b/mysql-test/t/ctype_latin1_de.test
@@ -89,7 +89,6 @@ drop table t1;
#
# Bug #5447 Select does not find records
#
-DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
autor varchar(80) NOT NULL default '',
PRIMARY KEY (autor)
diff --git a/mysql-test/t/derived.test b/mysql-test/t/derived.test
index fbfd3ccdef1..64e3fe8929b 100644
--- a/mysql-test/t/derived.test
+++ b/mysql-test/t/derived.test
@@ -101,7 +101,7 @@ SELECT a.x FROM (SELECT 1 AS x) AS a HAVING a.x = 1;
#
# Connect without a database
create table t1 select 1 as a;
-connect (con1,localhost,mysqltest_1,,*NO-ONE*,$MASTER_MYPORT,master.sock);
+connect (con1,localhost,mysqltest_1,,*NO-ONE*,$MASTER_MYPORT,$MASTER_MYSOCK);
connection con1;
--error 1046
select 2 as a from (select * from t1) b;
diff --git a/mysql-test/t/handler.test b/mysql-test/t/handler.test
index b7fe5d10297..3de8e8ae784 100644
--- a/mysql-test/t/handler.test
+++ b/mysql-test/t/handler.test
@@ -174,30 +174,34 @@ handler t1 open;
# Check accesibility of all the tables.
#
use test;
---error 1109;
+--error 1064
handler test.t1 read first limit 9;
+--error 1064
handler test_test.t1 read first limit 9;
handler t1 read first limit 9;
+--error 1064
handler test_test.t2 read first limit 9;
handler t2 read first limit 9;
+
#
# Cleanup.
#
+--error 1064
handler test_test.t1 close;
---error 1109;
handler t1 close;
drop table test_test.t1;
+--error 1064
handler test_test.t2 close;
---error 1109;
handler t2 close;
drop table test_test.t2;
drop database test_test;
+
#
use test;
---error 1109;
+--error 1064
handler test.t1 close;
---error 1109;
+--error 1109
handler t1 close;
drop table test.t1;
@@ -234,7 +238,7 @@ handler t2 open t1;
--error 1066
handler t3 open t1;
handler t1 read first limit 9;
---error 1109
+--error 1064
handler test.t1 close;
--error 1066
handler test.t1 open h1;
@@ -246,11 +250,11 @@ handler t1 read first limit 9;
handler h1 read first limit 9;
handler h2 read first limit 9;
handler h3 read first limit 9;
-handler test.h2 read first limit 9;
---error 1109
+handler h2 read first limit 9;
+--error 1064
handler test.h1 close;
-handler test_test.t1 close;
-handler test_test.h1 close;
+handler t1 close;
+handler h1 close;
handler h2 close;
--error 1109
handler t1 read first limit 9;
@@ -259,12 +263,12 @@ handler h1 read first limit 9;
--error 1109
handler h2 read first limit 9;
handler h3 read first limit 9;
-handler test_test.h3 read first limit 9;
+handler h3 read first limit 9;
use test_test;
handler h3 read first limit 9;
---error 1109
+--error 1064
handler test.h3 read first limit 9;
-handler test_test.h3 close;
+handler h3 close;
use test;
drop table t3;
drop table t2;
diff --git a/mysql-test/t/multi_update.test b/mysql-test/t/multi_update.test
index e56636bd2ba..e2aebd014f8 100644
--- a/mysql-test/t/multi_update.test
+++ b/mysql-test/t/multi_update.test
@@ -5,6 +5,11 @@
--disable_warnings
drop table if exists t1,t2,t3;
drop database if exists mysqltest;
+--error 0,1141
+revoke all privileges on mysqltest.t1 from mysqltest_1@localhost;
+--error 0,1141
+revoke all privileges on mysqltest.* from mysqltest_1@localhost;
+delete from mysql.user where user=_binary'mysqltest_1';
--enable_warnings
create table t1(id1 int not null auto_increment primary key, t char(12));
@@ -383,10 +388,10 @@ select * from t2;
drop table t1, t2;
#
-# prevelege chexk for multiupdate with other tables
+# privilege check for multiupdate with other tables
#
-connect (root,localhost,root,,test,$MASTER_MYPORT,master.sock);
+connect (root,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK);
connection root;
--disable_warnings
create database mysqltest;
@@ -396,7 +401,7 @@ create table mysqltest.t2 (a int, b int, primary key (a));
create table mysqltest.t3 (a int, b int, primary key (a));
grant select on mysqltest.* to mysqltest_1@localhost;
grant update on mysqltest.t1 to mysqltest_1@localhost;
-connect (user1,localhost,mysqltest_1,,mysqltest,$MASTER_MYPORT,master.sock);
+connect (user1,localhost,mysqltest_1,,mysqltest,$MASTER_MYPORT,$MASTER_MYSOCK);
connection user1;
update t1, t2 set t1.b=1 where t1.a=t2.a;
update t1, t2 set t1.b=(select t3.b from t3 where t1.a=t3.a) where t1.a=t2.a;
diff --git a/mysql-test/t/range.test b/mysql-test/t/range.test
index 61886221fcf..cd6620f7126 100644
--- a/mysql-test/t/range.test
+++ b/mysql-test/t/range.test
@@ -423,6 +423,9 @@ select count(*) from t1 where x=0;
select count(*) from t1 where x<0;
select count(*) from t1 where x < -16;
select count(*) from t1 where x = -16;
+# The following query returns wrong value because the range optimizer can't
+# handle search on a signed value for an unsigned parameter. This will be fixed in
+# 5.0
select count(*) from t1 where x > -16;
select count(*) from t1 where x = 18446744073709551601;
diff --git a/mysql-test/t/rename.test b/mysql-test/t/rename.test
index e6dc6ce9456..497ff721c99 100644
--- a/mysql-test/t/rename.test
+++ b/mysql-test/t/rename.test
@@ -5,7 +5,7 @@
--disable_warnings
drop table if exists t0,t1,t2,t3,t4;
# Clear up from other tests (to ensure that SHOW TABLES below is right)
-drop table if exists t0,t5,t6,t7,t8,t9;
+drop table if exists t0,t5,t6,t7,t8,t9,t1_1,t1_2,t9_1,t9_2;
--enable_warnings
create table t0 SELECT 1,"table 1";
diff --git a/mysql-test/t/select.test b/mysql-test/t/select.test
index 4490f97765b..c260c7777e2 100644
--- a/mysql-test/t/select.test
+++ b/mysql-test/t/select.test
@@ -8,6 +8,8 @@
--disable_warnings
drop table if exists t1,t2,t3,t4;
+# The following may be left from older tests
+drop table if exists t1_1,t1_2,t9_1,t9_2;
--enable_warnings
CREATE TABLE t1 (
diff --git a/mysql-test/t/show_check.test b/mysql-test/t/show_check.test
index 759ed7d22b3..681127eab5e 100644
--- a/mysql-test/t/show_check.test
+++ b/mysql-test/t/show_check.test
@@ -5,6 +5,10 @@
--disable_warnings
drop table if exists t1,t2;
drop database if exists mysqltest;
+
+delete from mysql.user where user='mysqltest_1' || user='mysqltest_2' || user='mysqltest_3';
+delete from mysql.db where user='mysqltest_1' || user='mysqltest_2' || user='mysqltest_3';
+flush privileges;
--enable_warnings
create table t1 (a int not null primary key, b int not null,c int not null, key(b,c));
diff --git a/mysql-test/t/type_timestamp.test b/mysql-test/t/type_timestamp.test
index d3bda858b8b..5978c24ddc4 100644
--- a/mysql-test/t/type_timestamp.test
+++ b/mysql-test/t/type_timestamp.test
@@ -62,6 +62,17 @@ INSERT INTO t1 VALUES ("2030-01-01","2030-01-01 00:00:00",20300101000000);
SELECT * FROM t1;
drop table t1;
+create table t1 (t2 timestamp(2), t4 timestamp(4), t6 timestamp(6),
+ t8 timestamp(8), t10 timestamp(10), t12 timestamp(12),
+ t14 timestamp(14));
+insert t1 values (0,0,0,0,0,0,0),
+("1997-12-31 23:47:59", "1997-12-31 23:47:59", "1997-12-31 23:47:59",
+"1997-12-31 23:47:59", "1997-12-31 23:47:59", "1997-12-31 23:47:59",
+"1997-12-31 23:47:59");
+select * from t1;
+select * from t1;
+drop table t1;
+
#
# Let us check if we properly treat wrong datetimes and produce proper warnings
# (for both strings and numbers)
@@ -270,7 +281,6 @@ drop table t1;
# Test for bug #4131, TIMESTAMP columns missing minutes and seconds when
# using GROUP BY in @@new=1 mode.
#
-set new=1;
create table t1 (a char(2), t timestamp);
insert into t1 values ('a', '2004-01-01 00:00:00'), ('a', '2004-01-01 01:00:00'),
('b', '2004-02-01 00:00:00');
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index 5b6484f5017..8ff479df098 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -1166,8 +1166,8 @@ Item_func_nullif::val_str(String *str)
bool
Item_func_nullif::is_null()
{
- if (!(this->*cmp_func)())
- return null_value=1;
+ if (!cmp.compare())
+ return (null_value=1);
return 0;
}
diff --git a/sql/item_func.cc b/sql/item_func.cc
index 0bddeed14d6..c7cd9d26974 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -2736,6 +2736,8 @@ void Item_func_get_user_var::fix_length_and_dec()
case STRING_RESULT:
max_length= MAX_BLOB_WIDTH;
break;
+ case ROW_RESULT: // Keep compiler happy
+ break;
}
}
else
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index 8a81c0690b8..538590e6197 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -729,6 +729,7 @@ void wait_for_refresh(THD *thd);
int open_tables(THD *thd, TABLE_LIST *tables, uint *counter);
int simple_open_n_lock_tables(THD *thd,TABLE_LIST *tables);
int open_and_lock_tables(THD *thd,TABLE_LIST *tables);
+void relink_tables_for_derived(THD *thd);
int lock_tables(THD *thd, TABLE_LIST *tables, uint counter);
TABLE *open_temporary_table(THD *thd, const char *path, const char *db,
const char *table_name, bool link_in_list);
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index b9fc5477449..b173a62efbb 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -2118,7 +2118,7 @@ static void check_data_home(const char *path)
/* ARGSUSED */
-! extern "C" int my_message_sql(uint error, const char *str, myf MyFlags)
+extern "C" int my_message_sql(uint error, const char *str, myf MyFlags)
{
THD *thd;
DBUG_ENTER("my_message_sql");
@@ -2132,7 +2132,11 @@ static void check_data_home(const char *path)
if (thd->lex->current_select &&
thd->lex->current_select->no_error && !thd->is_fatal_error)
{
- DBUG_PRINT("error", ("above error converted to warning"));
+ DBUG_PRINT("error", ("Error converted to warning: current_select: no_error %d fatal_error: %d",
+ (thd->lex->current_select ?
+ thd->lex->current_select->no_error : 0),
+ (int) thd->is_fatal_error));
+
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_ERROR, error, str);
}
else
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index a5284a543e6..fc252c1f5ac 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -2699,10 +2699,11 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables,
{
TABLE_LIST *table;
char *user = thd->priv_user;
+ DBUG_ENTER("check_grant");
want_access &= ~thd->master_access;
if (!want_access)
- return 0; // ok
+ DBUG_RETURN(0); // ok
rw_rdlock(&LOCK_grant);
for (table= tables; table && number--; table= table->next)
@@ -2739,7 +2740,7 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables,
}
}
rw_unlock(&LOCK_grant);
- return 0;
+ DBUG_RETURN(0);
err:
rw_unlock(&LOCK_grant);
@@ -2770,7 +2771,7 @@ err:
thd->host_or_ip,
table ? table->real_name : "unknown");
}
- return 1;
+ DBUG_RETURN(1);
}
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index a91371b4248..3c25d01ced0 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -1695,10 +1695,18 @@ int open_and_lock_tables(THD *thd, TABLE_LIST *tables)
uint counter;
if (open_tables(thd, tables, &counter) || lock_tables(thd, tables, counter))
DBUG_RETURN(-1); /* purecov: inspected */
- /*
- Let us propagate pointers to open tables from global table list
- to table lists in particular selects if needed.
- */
+ relink_tables_for_derived(thd);
+ DBUG_RETURN(mysql_handle_derived(thd->lex));
+}
+
+
+/*
+ Let us propagate pointers to open tables from global table list
+ to table lists in particular selects if needed.
+*/
+
+void relink_tables_for_derived(THD *thd)
+{
if (thd->lex->all_selects_list->next_select_in_list() ||
thd->lex->time_zone_tables_used)
{
@@ -1711,7 +1719,6 @@ int open_and_lock_tables(THD *thd, TABLE_LIST *tables)
if (cursor->table_list)
cursor->table= cursor->table_list->table;
}
- DBUG_RETURN(mysql_handle_derived(thd->lex));
}
@@ -1751,7 +1758,7 @@ int lock_tables(THD *thd, TABLE_LIST *tables, uint count)
if (!table->derived)
*(ptr++)= table->table;
}
- if (!(thd->lock=mysql_lock_tables(thd,start,count)))
+ if (!(thd->lock=mysql_lock_tables(thd,start, (uint) (ptr - start))))
return -1; /* purecov: inspected */
}
else
diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc
index 1e50e1e571e..33537d1080a 100644
--- a/sql/sql_handler.cc
+++ b/sql/sql_handler.cc
@@ -159,7 +159,8 @@ int mysql_ha_open(THD *thd, TABLE_LIST *tables, bool reopen)
/*
HASH entries are of type TABLE_LIST.
*/
- if (hash_init(&thd->handler_tables_hash, HANDLER_TABLES_HASH_SIZE, 0, 0,
+ if (hash_init(&thd->handler_tables_hash, &my_charset_latin1,
+ HANDLER_TABLES_HASH_SIZE, 0, 0,
(hash_get_key) mysql_ha_hash_get_key,
(hash_free_key) mysql_ha_hash_free, 0))
goto err;
@@ -223,7 +224,7 @@ int mysql_ha_open(THD *thd, TABLE_LIST *tables, bool reopen)
memcpy(hash_tables->alias, tables->alias, aliaslen);
/* add to hash */
- if (hash_insert(&thd->handler_tables_hash, (byte*) hash_tables))
+ if (my_hash_insert(&thd->handler_tables_hash, (byte*) hash_tables))
{
mysql_ha_close(thd, tables);
goto err;
@@ -293,7 +294,7 @@ int mysql_ha_close(THD *thd, TABLE_LIST *tables)
{
if (*table_ptr)
{
- table_ptr->file->ha_index_or_rnd_end();
+ (*table_ptr)->file->ha_index_or_rnd_end();
VOID(pthread_mutex_lock(&LOCK_open));
if (close_thread_table(thd, table_ptr))
{
@@ -582,7 +583,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
}
ok:
mysql_unlock_tables(thd,lock);
- send_eof(&thd->net);
+ send_eof(thd);
DBUG_PRINT("exit",("mysql_ha_read: OK"));
DBUG_RETURN(0);
err:
@@ -645,8 +646,10 @@ int mysql_ha_flush(THD *thd, TABLE_LIST *tables, int mode_flags)
while (*table_ptr)
{
if ((! *tmp_tables->db ||
- ! my_strcasecmp((*table_ptr)->table_cache_key, tmp_tables->db)) &&
- ! my_strcasecmp((*table_ptr)->real_name, tmp_tables->real_name))
+ ! my_strcasecmp(&my_charset_latin1, (*table_ptr)->table_cache_key,
+ tmp_tables->db)) &&
+ ! my_strcasecmp(&my_charset_latin1, (*table_ptr)->real_name,
+ tmp_tables->real_name))
{
DBUG_PRINT("info",("mysql_ha_flush: *table_ptr '%s'.'%s' as '%s'",
(*table_ptr)->table_cache_key,
@@ -725,7 +728,7 @@ static int mysql_ha_flush_table(THD *thd, TABLE **table_ptr, int mode_flags)
}
}
- table_ptr->file->ha_index_or_rnd_end();
+ (*table_ptr)->file->ha_index_or_rnd_end();
if (close_thread_table(thd, table_ptr))
{
/* Tell threads waiting for refresh that something has happened */
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index dffe7bcb2b0..d198855a2d3 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -599,7 +599,7 @@ typedef struct st_lex
USER_RESOURCES mqh;
ulong thread_id,type;
enum_sql_command sql_command;
- thr_lock_type lock_option;
+ thr_lock_type lock_option, multi_lock_option;
enum SSL_type ssl_type; /* defined in violite.h */
enum my_lex_states next_state;
enum enum_duplicates duplicates;
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 156c20edc0c..7a389a906c0 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -7188,7 +7188,7 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit,
if (keys.is_set(nr))
{
int flag;
- if (flag=test_if_order_by_key(order, table, nr, &not_used))
+ if ((flag= test_if_order_by_key(order, table, nr, &not_used)))
{
if (!no_changes)
{
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 44bc2a9efc9..c5cd2860e03 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -1,5 +1,4 @@
-/* Copyright (C) 2000 MySQL AB
-/* Copyright (C) 2000 MySQL AB
+/* Copyright (C) 2000-2004 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 5cb328f530b..6305da85d30 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -2265,31 +2265,32 @@ int mysql_check_table(THD* thd, TABLE_LIST* tables,HA_CHECK_OPT* check_opt)
&handler::check));
}
+
/* table_list should contain just one table */
-int mysql_discard_or_import_tablespace(THD *thd,
- TABLE_LIST *table_list,
- enum tablespace_op_type tablespace_op)
+static int
+mysql_discard_or_import_tablespace(THD *thd,
+ TABLE_LIST *table_list,
+ enum tablespace_op_type tablespace_op)
{
TABLE *table;
my_bool discard;
int error;
DBUG_ENTER("mysql_discard_or_import_tablespace");
- /* Note that DISCARD/IMPORT TABLESPACE always is the only operation in an
- ALTER TABLE */
+ /*
+ Note that DISCARD/IMPORT TABLESPACE always is the only operation in an
+ ALTER TABLE
+ */
thd->proc_info="discard_or_import_tablespace";
- if (tablespace_op == DISCARD_TABLESPACE)
- discard = TRUE;
- else
- discard = FALSE;
-
- thd->tablespace_op=TRUE; /* we set this flag so that ha_innobase::open
- and ::external_lock() do not complain when we
- lock the table */
- mysql_ha_close(thd, table_list, /*dont_send_ok*/ 1, /*dont_lock*/ 1);
+ discard= test(tablespace_op == DISCARD_TABLESPACE);
+ /*
+ We set this flag so that ha_innobase::open and ::external_lock() do
+ not complain when we lock the table
+ */
+ thd->tablespace_op= TRUE;
if (!(table=open_ltable(thd,table_list,TL_WRITE)))
{
thd->tablespace_op=FALSE;
@@ -2303,8 +2304,10 @@ int mysql_discard_or_import_tablespace(THD *thd,
if (error)
goto err;
- /* The 0 in the call below means 'not in a transaction', which means
- immediate invalidation; that is probably what we wish here */
+ /*
+ The 0 in the call below means 'not in a transaction', which means
+ immediate invalidation; that is probably what we wish here
+ */
query_cache_invalidate3(thd, table_list, 0);
/* The ALTER TABLE is always in its own transaction */
diff --git a/sql/sql_update.cc b/sql/sql_update.cc
index 25d94d6d039..d3597f274dc 100644
--- a/sql/sql_update.cc
+++ b/sql/sql_update.cc
@@ -303,6 +303,7 @@ int mysql_update(THD *thd,
else if (handle_duplicates != DUP_IGNORE ||
error != HA_ERR_FOUND_DUPP_KEY)
{
+ thd->fatal_error(); // Force error message
table->file->print_error(error,MYF(0));
error= 1;
break;
@@ -484,6 +485,8 @@ int mysql_multi_update(THD *thd,
TABLE_LIST *tl;
TABLE_LIST *update_list= (TABLE_LIST*) thd->lex->select_lex.table_list.first;
List<Item> total_list;
+ const bool using_lock_tables= thd->locked_tables != 0;
+ bool initialized_dervied= 0;
DBUG_ENTER("mysql_multi_update");
select_lex->select_limit= HA_POS_ERROR;
@@ -495,15 +498,24 @@ int mysql_multi_update(THD *thd,
for (;;)
{
table_map update_tables, derived_tables=0;
- uint tnr, counter;
+ uint tnr, table_count;
- if ((res=open_tables(thd,table_list, &counter)))
+ if ((res=open_tables(thd, table_list, &table_count)))
DBUG_RETURN(res);
/* Only need to call lock_tables if we are not using LOCK TABLES */
- if (!using_lock_tables && ((res= lock_tables(thd, table_list))))
+ if (!using_lock_tables &&
+ ((res= lock_tables(thd, table_list, table_count))))
DBUG_RETURN(res);
+ if (!initialized_dervied)
+ {
+ initialized_dervied= 1;
+ relink_tables_for_derived(thd);
+ if ((res= mysql_handle_derived(thd->lex)))
+ DBUG_RETURN(res);
+ }
+
/*
Ensure that we have update privilege for all tables and columns in the
SET part
@@ -558,7 +570,7 @@ int mysql_multi_update(THD *thd,
DBUG_RETURN(-1);
}
DBUG_PRINT("info",("setting table `%s` for update", tl->alias));
- tl->lock_type= thd->lex.lock_option;
+ tl->lock_type= thd->lex->multi_lock_option;
tl->updating= 1;
}
else
@@ -569,6 +581,8 @@ int mysql_multi_update(THD *thd,
}
if (tl->derived)
derived_tables|= table->map;
+ else if (!using_lock_tables)
+ tl->table->reginfo.lock_type= tl->lock_type;
}
if (thd->lex->derived_tables && (update_tables & derived_tables))
@@ -586,7 +600,7 @@ int mysql_multi_update(THD *thd,
}
/* Relock the tables with the correct modes */
- res= lock_tables(thd,table_list);
+ res= lock_tables(thd, table_list, table_count);
if (using_lock_tables)
{
if (res)
@@ -608,7 +622,7 @@ int mysql_multi_update(THD *thd,
item->cleanup();
}
}
- if (setup_fields(thd, table_list, *fields, 1, 0, 0))
+ if (setup_fields(thd, 0, update_list, *fields, 1, 0, 0))
DBUG_RETURN(-1);
/*
If lock succeded and the table map didn't change since the above lock
@@ -624,9 +638,7 @@ int mysql_multi_update(THD *thd,
close_thread_tables(thd);
}
- /*
- Setup timestamp handling
- */
+ /* Setup timestamp handling */
for (tl= update_list; tl; tl= tl->next)
{
TABLE *table= tl->table;
@@ -634,6 +646,9 @@ int mysql_multi_update(THD *thd,
if (table->timestamp_field &&
table->timestamp_field->query_id == thd->query_id)
table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;
+
+ /* We only need SELECT privilege for columns in the values list */
+ table->grant.want_privilege= (SELECT_ACL & ~table->grant.privilege);
}
if (!(result=new multi_update(thd, update_list, fields, values,
@@ -994,6 +1009,7 @@ bool multi_update::send_data(List<Item> &not_used_values)
if (handle_duplicates != DUP_IGNORE ||
error != HA_ERR_FOUND_DUPP_KEY)
{
+ thd->fatal_error(); // Force error message
table->file->print_error(error,MYF(0));
DBUG_RETURN(1);
}
@@ -1149,7 +1165,10 @@ int multi_update::do_updates(bool from_send_error)
err:
if (!from_send_error)
+ {
+ thd->fatal_error();
table->file->print_error(local_error,MYF(0));
+ }
(void) table->file->ha_rnd_end();
(void) tmp_table->file->ha_rnd_end();
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 7982b501ac4..7cf24d3972d 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -4169,7 +4169,7 @@ update:
if (lex->select_lex.table_list.elements > 1)
{
lex->sql_command= SQLCOM_UPDATE_MULTI;
- lex->lock_option= $3;
+ lex->multi_lock_option= $3;
}
else if (lex->select_lex.get_table_list()->derived)
{