Commit 36429430 authored by unknown's avatar unknown

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

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

parents 61daab79 68b4940a
...@@ -140,6 +140,7 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef, ...@@ -140,6 +140,7 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef,
share->auto_key= create_info->auto_key; share->auto_key= create_info->auto_key;
share->auto_key_type= create_info->auto_key_type; share->auto_key_type= create_info->auto_key_type;
share->auto_increment= create_info->auto_increment; share->auto_increment= create_info->auto_increment;
/* Must be allocated separately for rename to work */
if (!(share->name= my_strdup(name,MYF(0)))) if (!(share->name= my_strdup(name,MYF(0))))
{ {
my_free((gptr) share,MYF(0)); my_free((gptr) share,MYF(0));
......
...@@ -62,7 +62,8 @@ int heap_update(HP_INFO *info, const byte *old, const byte *heap_new) ...@@ -62,7 +62,8 @@ int heap_update(HP_INFO *info, const byte *old, const byte *heap_new)
/* we don't need to delete non-inserted key from rb-tree */ /* we don't need to delete non-inserted key from rb-tree */
if ((*keydef->write_key)(info, keydef, old, pos)) if ((*keydef->write_key)(info, keydef, old, pos))
{ {
if (++(share->records) == share->blength) share->blength+= share->blength; if (++(share->records) == share->blength)
share->blength+= share->blength;
DBUG_RETURN(my_errno); DBUG_RETURN(my_errno);
} }
keydef--; keydef--;
...@@ -78,6 +79,7 @@ int heap_update(HP_INFO *info, const byte *old, const byte *heap_new) ...@@ -78,6 +79,7 @@ int heap_update(HP_INFO *info, const byte *old, const byte *heap_new)
keydef--; keydef--;
} }
} }
if (++(share->records) == share->blength) share->blength+= share->blength; if (++(share->records) == share->blength)
share->blength+= share->blength;
DBUG_RETURN(my_errno); DBUG_RETURN(my_errno);
} /* heap_update */ } /* heap_update */
...@@ -155,7 +155,7 @@ static byte *next_free_record_pos(HP_SHARE *info) ...@@ -155,7 +155,7 @@ static byte *next_free_record_pos(HP_SHARE *info)
/* Write a hash-key to the hash-index */ /* Write a hash-key to the hash-index */
int hp_write_key(HP_INFO *info, HP_KEYDEF *keyinfo, int hp_write_key(HP_INFO *info, HP_KEYDEF *keyinfo,
const byte *record, byte *recpos) const byte *record, byte *recpos)
{ {
HP_SHARE *share = info->s; HP_SHARE *share = info->s;
int flag; int flag;
......
...@@ -19,7 +19,7 @@ TZ=GMT-3; export TZ # for UNIX_TIMESTAMP tests to work ...@@ -19,7 +19,7 @@ TZ=GMT-3; export TZ # for UNIX_TIMESTAMP tests to work
# Program Definitions # Program Definitions
#-- #--
PATH=/bin:/usr/bin:/usr/local/bin:/usr/bsd:/usr/X11R6/bin:/usr/openwin/bin:/usr/bin/X11 PATH=/bin:/usr/bin:/usr/local/bin:/usr/bsd:/usr/X11R6/bin:/usr/openwin/bin:/usr/bin/X11:$PATH
MASTER_40_ARGS="--rpl-recovery-rank=1 --init-rpl-role=master" MASTER_40_ARGS="--rpl-recovery-rank=1 --init-rpl-role=master"
# Standard functions # Standard functions
...@@ -319,8 +319,8 @@ while test $# -gt 0; do ...@@ -319,8 +319,8 @@ while test $# -gt 0; do
VALGRIND="valgrind --alignment=8 --leak-check=yes" VALGRIND="valgrind --alignment=8 --leak-check=yes"
EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT --skip-safemalloc" EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT --skip-safemalloc"
EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT --skip-safemalloc" EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT --skip-safemalloc"
SLEEP_TIME_AFTER_RESTART=120 SLEEP_TIME_AFTER_RESTART=60
SLEEP_TIME_FOR_DELETE=120 SLEEP_TIME_FOR_DELETE=60
;; ;;
--valgrind-options=*) --valgrind-options=*)
TMP=`$ECHO "$1" | $SED -e "s;--valgrind-options=;;"` TMP=`$ECHO "$1" | $SED -e "s;--valgrind-options=;;"`
......
SELECT (1,2,3)=(1,2,3); SELECT ROW(1,2,3)=ROW(1,2,3);
(1,2,3)=(1,2,3) ROW(1,2,3)=ROW(1,2,3)
1 1
SELECT (2,2,3)=(1+1,2,3); SELECT ROW(2,2,3)=ROW(1+1,2,3);
(2,2,3)=(1+1,2,3) ROW(2,2,3)=ROW(1+1,2,3)
1 1
SELECT (1,2,3)=(1+1,2,3); SELECT ROW(1,2,3)=ROW(1+1,2,3);
(1,2,3)=(1+1,2,3) ROW(1,2,3)=ROW(1+1,2,3)
0 0
SELECT (1,2,3)<(1+1,2,3); SELECT ROW(1,2,3)<ROW(1+1,2,3);
(1,2,3)<(1+1,2,3) ROW(1,2,3)<ROW(1+1,2,3)
1 1
SELECT (1,2,3)>(1+1,2,3); SELECT ROW(1,2,3)>ROW(1+1,2,3);
(1,2,3)>(1+1,2,3) ROW(1,2,3)>ROW(1+1,2,3)
0 0
SELECT (1,2,3)<=(1+1,2,3); SELECT ROW(1,2,3)<=ROW(1+1,2,3);
(1,2,3)<=(1+1,2,3) ROW(1,2,3)<=ROW(1+1,2,3)
1 1
SELECT (1,2,3)>=(1+1,2,3); SELECT ROW(1,2,3)>=ROW(1+1,2,3);
(1,2,3)>=(1+1,2,3) ROW(1,2,3)>=ROW(1+1,2,3)
0 0
SELECT (1,2,3)<>(1+1,2,3); SELECT ROW(1,2,3)<>ROW(1+1,2,3);
(1,2,3)<>(1+1,2,3) ROW(1,2,3)<>ROW(1+1,2,3)
1 1
SELECT (NULL,2,3)=(NULL,2,3); SELECT ROW(NULL,2,3)=ROW(NULL,2,3);
(NULL,2,3)=(NULL,2,3) ROW(NULL,2,3)=ROW(NULL,2,3)
NULL NULL
SELECT (NULL,2,3)<=>(NULL,2,3); SELECT ROW(NULL,2,3)<=>ROW(NULL,2,3);
(NULL,2,3)<=>(NULL,2,3) ROW(NULL,2,3)<=>ROW(NULL,2,3)
1 1
SELECT (1,2,(3,4,5))=(1,2,(3,4,5)); SELECT ROW(1,2,ROW(3,4,5))=ROW(1,2,ROW(3,4,5));
(1,2,(3,4,5))=(1,2,(3,4,5)) ROW(1,2,ROW(3,4,5))=ROW(1,2,ROW(3,4,5))
1 1
SELECT ('test',2,3.33)=('test',2,3.33); SELECT ROW('test',2,3.33)=ROW('test',2,3.33);
('test',2,3.33)=('test',2,3.33) ROW('test',2,3.33)=ROW('test',2,3.33)
1 1
SELECT ('test',2,3.33)=('test',2,3.33,4); SELECT ROW('test',2,3.33)=ROW('test',2,3.33,4);
Cardinality error (more/less than 3 columns) Cardinality error (more/less than 3 columns)
drop table if exists t1; drop table if exists t1;
create table t1 ( a int, b int, c int); create table t1 ( a int, b int, c int);
insert into t1 values (1,2,3), (2,3,1), (3,2,1); insert into t1 values (1,2,3), (2,3,1), (3,2,1);
select * from t1 where (1,2,3)=(a,b,c); select * from t1 where ROW(1,2,3)=ROW(a,b,c);
a b c a b c
1 2 3 1 2 3
select * from t1 where (0,2,3)=(a,b,c); select * from t1 where ROW(0,2,3)=ROW(a,b,c);
a b c a b c
select * from t1 where (1,2,3)<(a,b,c); select * from t1 where ROW(1,2,3)<ROW(a,b,c);
a b c a b c
2 3 1 2 3 1
3 2 1 3 2 1
drop table t1; drop table t1;
select (1,1); select ROW(1,1);
Cardinality error (more/less than 1 columns) Cardinality error (more/less than 1 columns)
drop table if exists t1; drop table if exists t1;
create table t1 (i int); create table t1 (i int);
select 1 from t1 where (1,1); select 1 from t1 where ROW(1,1);
Cardinality error (more/less than 1 columns) Cardinality error (more/less than 1 columns)
select count(*) from t1 order by (1,1); select count(*) from t1 order by ROW(1,1);
Cardinality error (more/less than 1 columns) Cardinality error (more/less than 1 columns)
drop table t1; drop table t1;
...@@ -413,6 +413,8 @@ a b ...@@ -413,6 +413,8 @@ a b
2 12 2 12
update t1 set b= (select b from t1); update t1 set b= (select b from t1);
INSERT TABLE 't1' isn't allowed in FROM table list INSERT TABLE 't1' isn't allowed in FROM table list
update t1 set b= (select b from t2);
Subselect returns more than 1 record
update t1 set b= (select b from t2 where t1.a = t2.a); update t1 set b= (select b from t2 where t1.a = t2.a);
select * from t1; select * from t1;
a b a b
...@@ -434,6 +436,8 @@ a b ...@@ -434,6 +436,8 @@ a b
2 12 2 12
delete from t1 where b = (select b from t1); delete from t1 where b = (select b from t1);
INSERT TABLE 't1' isn't allowed in FROM table list INSERT TABLE 't1' isn't allowed in FROM table list
delete from t1 where b = (select b from t2);
Subselect returns more than 1 record
delete from t1 where b = (select b from t2 where t1.a = t2.a); delete from t1 where b = (select b from t2 where t1.a = t2.a);
select * from t1; select * from t1;
a b a b
...@@ -459,6 +463,8 @@ a b ...@@ -459,6 +463,8 @@ a b
2 12 2 12
delete t11.*, t12.* from t11,t12 where t11.a = t12.a and t11.b = (select b from t12 where t11.a = t12.a); delete t11.*, t12.* from t11,t12 where t11.a = t12.a and t11.b = (select b from t12 where t11.a = t12.a);
INSERT TABLE 't12' isn't allowed in FROM table list INSERT TABLE 't12' isn't allowed in FROM table list
delete t11.*, t12.* from t11,t12 where t11.a = t12.a and t11.b = (select b from t2);
Subselect returns more than 1 record
delete t11.*, t12.* from t11,t12 where t11.a = t12.a and t11.b = (select b from t2 where t11.a = t2.a); delete t11.*, t12.* from t11,t12 where t11.a = t12.a and t11.b = (select b from t2 where t11.a = t2.a);
select * from t11; select * from t11;
a b a b
...@@ -471,9 +477,13 @@ a b ...@@ -471,9 +477,13 @@ a b
drop table t11, t12, t2; drop table t11, t12, t2;
CREATE TABLE t1 (x int); CREATE TABLE t1 (x int);
create table t2 (a int); create table t2 (a int);
create table t3 (a int);
insert into t2 values (1); insert into t2 values (1);
insert into t3 values (1),(2);
INSERT INTO t1 (x) VALUES ((SELECT x FROM t1)); INSERT INTO t1 (x) VALUES ((SELECT x FROM t1));
INSERT TABLE 't1' isn't allowed in FROM table list INSERT TABLE 't1' isn't allowed in FROM table list
INSERT INTO t1 (x) VALUES ((SELECT a FROM t3));
Subselect returns more than 1 record
INSERT INTO t1 (x) VALUES ((SELECT a FROM t2)); INSERT INTO t1 (x) VALUES ((SELECT a FROM t2));
select * from t1; select * from t1;
x x
...@@ -501,14 +511,18 @@ x ...@@ -501,14 +511,18 @@ x
3 3
3 3
0 0
drop table t1, t2; drop table t1, t2, t3;
CREATE TABLE t1 (x int not null, y int, primary key (x)); CREATE TABLE t1 (x int not null, y int, primary key (x));
create table t2 (a int); create table t2 (a int);
create table t3 (a int);
insert into t2 values (1); insert into t2 values (1);
insert into t3 values (1),(2);
select * from t1; select * from t1;
x y x y
replace into t1 (x, y) VALUES ((SELECT x FROM t1), (SELECT a+1 FROM t2)); replace into t1 (x, y) VALUES ((SELECT x FROM t1), (SELECT a+1 FROM t2));
INSERT TABLE 't1' isn't allowed in FROM table list INSERT TABLE 't1' isn't allowed in FROM table list
replace into t1 (x, y) VALUES ((SELECT a FROM t3), (SELECT a+1 FROM t2));
Subselect returns more than 1 record
replace into t1 (x, y) VALUES ((SELECT a FROM t2), (SELECT a+1 FROM t2)); replace into t1 (x, y) VALUES ((SELECT a FROM t2), (SELECT a+1 FROM t2));
select * from t1; select * from t1;
x y x y
...@@ -533,7 +547,7 @@ x y ...@@ -533,7 +547,7 @@ x y
1 3 1 3
4 2 4 2
2 1 2 1
drop table t1, t2; drop table t1, t2, t3;
SELECT * FROM (SELECT 1) b WHERE 1 IN (SELECT *); SELECT * FROM (SELECT 1) b WHERE 1 IN (SELECT *);
No tables used No tables used
drop table if exists t; drop table if exists t;
...@@ -575,4 +589,8 @@ SELECT * FROM t; ...@@ -575,4 +589,8 @@ SELECT * FROM t;
id id
1 1
2 2
CREATE TABLE t1 (id int(11) default NULL, KEY id (id)) TYPE=MyISAM CHARSET=latin1;
INSERT INTO t1 values (1),(1);
UPDATE t SET id=(SELECT * FROM t1);
Subselect returns more than 1 record
drop table t; drop table t;
SELECT (1,2,3)=(1,2,3); SELECT ROW(1,2,3)=ROW(1,2,3);
SELECT (2,2,3)=(1+1,2,3); SELECT ROW(2,2,3)=ROW(1+1,2,3);
SELECT (1,2,3)=(1+1,2,3); SELECT ROW(1,2,3)=ROW(1+1,2,3);
SELECT (1,2,3)<(1+1,2,3); SELECT ROW(1,2,3)<ROW(1+1,2,3);
SELECT (1,2,3)>(1+1,2,3); SELECT ROW(1,2,3)>ROW(1+1,2,3);
SELECT (1,2,3)<=(1+1,2,3); SELECT ROW(1,2,3)<=ROW(1+1,2,3);
SELECT (1,2,3)>=(1+1,2,3); SELECT ROW(1,2,3)>=ROW(1+1,2,3);
SELECT (1,2,3)<>(1+1,2,3); SELECT ROW(1,2,3)<>ROW(1+1,2,3);
SELECT (NULL,2,3)=(NULL,2,3); SELECT ROW(NULL,2,3)=ROW(NULL,2,3);
SELECT (NULL,2,3)<=>(NULL,2,3); SELECT ROW(NULL,2,3)<=>ROW(NULL,2,3);
SELECT (1,2,(3,4,5))=(1,2,(3,4,5)); SELECT ROW(1,2,ROW(3,4,5))=ROW(1,2,ROW(3,4,5));
SELECT ('test',2,3.33)=('test',2,3.33); SELECT ROW('test',2,3.33)=ROW('test',2,3.33);
-- error 1239 -- error 1239
SELECT ('test',2,3.33)=('test',2,3.33,4); SELECT ROW('test',2,3.33)=ROW('test',2,3.33,4);
drop table if exists t1; drop table if exists t1;
create table t1 ( a int, b int, c int); create table t1 ( a int, b int, c int);
insert into t1 values (1,2,3), (2,3,1), (3,2,1); insert into t1 values (1,2,3), (2,3,1), (3,2,1);
select * from t1 where (1,2,3)=(a,b,c); select * from t1 where ROW(1,2,3)=ROW(a,b,c);
select * from t1 where (0,2,3)=(a,b,c); select * from t1 where ROW(0,2,3)=ROW(a,b,c);
select * from t1 where (1,2,3)<(a,b,c); select * from t1 where ROW(1,2,3)<ROW(a,b,c);
drop table t1; drop table t1;
-- error 1239 -- error 1239
select (1,1); select ROW(1,1);
drop table if exists t1; drop table if exists t1;
create table t1 (i int); create table t1 (i int);
-- error 1239 -- error 1239
select 1 from t1 where (1,1); select 1 from t1 where ROW(1,1);
-- error 1239 -- error 1239
select count(*) from t1 order by (1,1); select count(*) from t1 order by ROW(1,1);
#TODO remove comments after parser fixing #TODO remove comments after parser fixing
#-- error 1239 #-- error 1239
#select count(*) from t1 order by i having (1,1); #select count(*) from t1 order by i having (1,1);
......
...@@ -246,6 +246,8 @@ insert into t2 values (1, 21),(2, 22),(3, 23); ...@@ -246,6 +246,8 @@ insert into t2 values (1, 21),(2, 22),(3, 23);
select * from t1; select * from t1;
-- error 1093 -- error 1093
update t1 set b= (select b from t1); update t1 set b= (select b from t1);
-- error 1240
update t1 set b= (select b from t2);
update t1 set b= (select b from t2 where t1.a = t2.a); update t1 set b= (select b from t2 where t1.a = t2.a);
select * from t1; select * from t1;
drop table t1, t2; drop table t1, t2;
...@@ -259,6 +261,8 @@ select * from t1; ...@@ -259,6 +261,8 @@ select * from t1;
select * from t1 where b = (select b from t2 where t1.a = t2.a); select * from t1 where b = (select b from t2 where t1.a = t2.a);
-- error 1093 -- error 1093
delete from t1 where b = (select b from t1); delete from t1 where b = (select b from t1);
-- error 1240
delete from t1 where b = (select b from t2);
delete from t1 where b = (select b from t2 where t1.a = t2.a); delete from t1 where b = (select b from t2 where t1.a = t2.a);
select * from t1; select * from t1;
drop table t1, t2; drop table t1, t2;
...@@ -275,6 +279,8 @@ select * from t11; ...@@ -275,6 +279,8 @@ select * from t11;
select * from t12; select * from t12;
-- error 1093 -- error 1093
delete t11.*, t12.* from t11,t12 where t11.a = t12.a and t11.b = (select b from t12 where t11.a = t12.a); delete t11.*, t12.* from t11,t12 where t11.a = t12.a and t11.b = (select b from t12 where t11.a = t12.a);
-- error 1240
delete t11.*, t12.* from t11,t12 where t11.a = t12.a and t11.b = (select b from t2);
delete t11.*, t12.* from t11,t12 where t11.a = t12.a and t11.b = (select b from t2 where t11.a = t2.a); delete t11.*, t12.* from t11,t12 where t11.a = t12.a and t11.b = (select b from t2 where t11.a = t2.a);
select * from t11; select * from t11;
select * from t12; select * from t12;
...@@ -283,9 +289,13 @@ drop table t11, t12, t2; ...@@ -283,9 +289,13 @@ drop table t11, t12, t2;
#insert with subselects #insert with subselects
CREATE TABLE t1 (x int); CREATE TABLE t1 (x int);
create table t2 (a int); create table t2 (a int);
create table t3 (a int);
insert into t2 values (1); insert into t2 values (1);
insert into t3 values (1),(2);
-- error 1093 -- error 1093
INSERT INTO t1 (x) VALUES ((SELECT x FROM t1)); INSERT INTO t1 (x) VALUES ((SELECT x FROM t1));
-- error 1240
INSERT INTO t1 (x) VALUES ((SELECT a FROM t3));
INSERT INTO t1 (x) VALUES ((SELECT a FROM t2)); INSERT INTO t1 (x) VALUES ((SELECT a FROM t2));
select * from t1; select * from t1;
insert into t2 values (1); insert into t2 values (1);
...@@ -299,15 +309,19 @@ INSERT INTO t1 (x) select (SELECT SUM(x)+2 FROM t1) FROM t2; ...@@ -299,15 +309,19 @@ INSERT INTO t1 (x) select (SELECT SUM(x)+2 FROM t1) FROM t2;
INSERT DELAYED INTO t1 (x) VALUES ((SELECT SUM(x) FROM t2)); INSERT DELAYED INTO t1 (x) VALUES ((SELECT SUM(x) FROM t2));
-- sleep 1 -- sleep 1
select * from t1; select * from t1;
drop table t1, t2; drop table t1, t2, t3;
#replace with subselects #replace with subselects
CREATE TABLE t1 (x int not null, y int, primary key (x)); CREATE TABLE t1 (x int not null, y int, primary key (x));
create table t2 (a int); create table t2 (a int);
create table t3 (a int);
insert into t2 values (1); insert into t2 values (1);
insert into t3 values (1),(2);
select * from t1; select * from t1;
-- error 1093 -- error 1093
replace into t1 (x, y) VALUES ((SELECT x FROM t1), (SELECT a+1 FROM t2)); replace into t1 (x, y) VALUES ((SELECT x FROM t1), (SELECT a+1 FROM t2));
-- error 1240
replace into t1 (x, y) VALUES ((SELECT a FROM t3), (SELECT a+1 FROM t2));
replace into t1 (x, y) VALUES ((SELECT a FROM t2), (SELECT a+1 FROM t2)); replace into t1 (x, y) VALUES ((SELECT a FROM t2), (SELECT a+1 FROM t2));
select * from t1; select * from t1;
replace into t1 (x, y) VALUES ((SELECT a FROM t2), (SELECT a+2 FROM t2)); replace into t1 (x, y) VALUES ((SELECT a FROM t2), (SELECT a+2 FROM t2));
...@@ -320,7 +334,7 @@ replace DELAYED into t1 (x, y) VALUES ((SELECT a+3 FROM t2), (SELECT a+1 FROM t2 ...@@ -320,7 +334,7 @@ replace DELAYED into t1 (x, y) VALUES ((SELECT a+3 FROM t2), (SELECT a+1 FROM t2
select * from t1; select * from t1;
replace LOW_PRIORITY into t1 (x, y) VALUES ((SELECT a+1 FROM t2), (SELECT a FROM t2)); replace LOW_PRIORITY into t1 (x, y) VALUES ((SELECT a+1 FROM t2), (SELECT a FROM t2));
select * from t1; select * from t1;
drop table t1, t2; drop table t1, t2, t3;
-- error 1096 -- error 1096
SELECT * FROM (SELECT 1) b WHERE 1 IN (SELECT *); SELECT * FROM (SELECT 1) b WHERE 1 IN (SELECT *);
...@@ -338,4 +352,8 @@ SELECT * FROM t WHERE id IN (SELECT 5 UNION SELECT 2); ...@@ -338,4 +352,8 @@ SELECT * FROM t WHERE id IN (SELECT 5 UNION SELECT 2);
-- error 1093 -- error 1093
INSERT INTO t VALUES ((SELECT * FROM t)); INSERT INTO t VALUES ((SELECT * FROM t));
SELECT * FROM t; SELECT * FROM t;
CREATE TABLE t1 (id int(11) default NULL, KEY id (id)) TYPE=MyISAM CHARSET=latin1;
INSERT INTO t1 values (1),(1);
-- error 1240
UPDATE t SET id=(SELECT * FROM t1);
drop table t; drop table t;
...@@ -41,7 +41,7 @@ Item_sum::Item_sum(List<Item> &list) ...@@ -41,7 +41,7 @@ Item_sum::Item_sum(List<Item> &list)
list.empty(); // Fields are used list.empty(); // Fields are used
} }
inline void Item_sum::mark_as_sum_func() void Item_sum::mark_as_sum_func()
{ {
current_thd->lex.current_select->with_sum_func= with_sum_func= 1; current_thd->lex.current_select->with_sum_func= with_sum_func= 1;
} }
......
...@@ -34,7 +34,7 @@ class Item_sum :public Item_result_field ...@@ -34,7 +34,7 @@ class Item_sum :public Item_result_field
uint arg_count; uint arg_count;
bool quick_group; /* If incremental update of fields */ bool quick_group; /* If incremental update of fields */
inline void mark_as_sum_func(); void mark_as_sum_func();
Item_sum() : arg_count(0),quick_group(1) Item_sum() : arg_count(0),quick_group(1)
{ {
mark_as_sum_func(); mark_as_sum_func();
......
...@@ -142,8 +142,6 @@ THD::THD():user_time(0), fatal_error(0), ...@@ -142,8 +142,6 @@ THD::THD():user_time(0), fatal_error(0),
bzero((char*) &con_root,sizeof(con_root)); bzero((char*) &con_root,sizeof(con_root));
bzero((char*) &warn_root,sizeof(warn_root)); bzero((char*) &warn_root,sizeof(warn_root));
init_alloc_root(&warn_root, 1024, 0); init_alloc_root(&warn_root, 1024, 0);
bzero((char*) warn_count, sizeof(warn_count));
warn_list.empty();
user_connect=(USER_CONN *)0; user_connect=(USER_CONN *)0;
hash_init(&user_vars, system_charset_info, USER_VARS_HASH_SIZE, 0, 0, hash_init(&user_vars, system_charset_info, USER_VARS_HASH_SIZE, 0, 0,
(hash_get_key) get_var_key, (hash_get_key) get_var_key,
...@@ -187,17 +185,20 @@ THD::THD():user_time(0), fatal_error(0), ...@@ -187,17 +185,20 @@ THD::THD():user_time(0), fatal_error(0),
void THD::init(void) void THD::init(void)
{ {
pthread_mutex_lock(&LOCK_global_system_variables);
variables= global_system_variables;
pthread_mutex_unlock(&LOCK_global_system_variables);
server_status= SERVER_STATUS_AUTOCOMMIT; server_status= SERVER_STATUS_AUTOCOMMIT;
update_lock_default= (variables.low_priority_updates ?
TL_WRITE_LOW_PRIORITY :
TL_WRITE);
options= thd_startup_options; options= thd_startup_options;
sql_mode=(uint) opt_sql_mode; sql_mode=(uint) opt_sql_mode;
open_options=ha_open_options; open_options=ha_open_options;
pthread_mutex_lock(&LOCK_global_system_variables); update_lock_default= (variables.low_priority_updates ?
variables= global_system_variables; TL_WRITE_LOW_PRIORITY :
pthread_mutex_unlock(&LOCK_global_system_variables); TL_WRITE);
session_tx_isolation= (enum_tx_isolation) variables.tx_isolation; session_tx_isolation= (enum_tx_isolation) variables.tx_isolation;
warn_list.empty();
bzero((char*) warn_count, sizeof(warn_count));
total_warn_count= 0;
} }
/* /*
...@@ -228,6 +229,7 @@ void THD::cleanup(void) ...@@ -228,6 +229,7 @@ void THD::cleanup(void)
{ {
DBUG_ENTER("THD::cleanup"); DBUG_ENTER("THD::cleanup");
ha_rollback(this); ha_rollback(this);
delete_tree(&prepared_statements);
if (locked_tables) if (locked_tables)
{ {
lock=locked_tables; locked_tables=0; lock=locked_tables; locked_tables=0;
...@@ -289,7 +291,6 @@ THD::~THD() ...@@ -289,7 +291,6 @@ THD::~THD()
free_root(&con_root,MYF(0)); free_root(&con_root,MYF(0));
free_root(&warn_root,MYF(0)); free_root(&warn_root,MYF(0));
free_root(&transaction.mem_root,MYF(0)); free_root(&transaction.mem_root,MYF(0));
delete_tree(&prepared_statements);
mysys_var=0; // Safety (shouldn't be needed) mysys_var=0; // Safety (shouldn't be needed)
pthread_mutex_destroy(&LOCK_delete); pthread_mutex_destroy(&LOCK_delete);
#ifndef DBUG_OFF #ifndef DBUG_OFF
......
...@@ -140,9 +140,11 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order, ...@@ -140,9 +140,11 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order,
deleted=0L; deleted=0L;
init_ftfuncs(thd, &thd->lex.select_lex, 1); init_ftfuncs(thd, &thd->lex.select_lex, 1);
thd->proc_info="updating"; thd->proc_info="updating";
while (!(error=info.read_record(&info)) && !thd->killed) while (!(error=info.read_record(&info)) && !thd->killed &&
!thd->net.report_error)
{ {
if (!(select && select->skipp_record())) // thd->net.report_error is tested to disallow delete row on error
if (!(select && select->skipp_record())&& !thd->net.report_error )
{ {
if (!(error=table->file->delete_row(table->record[0]))) if (!(error=table->file->delete_row(table->record[0])))
{ {
...@@ -205,7 +207,7 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order, ...@@ -205,7 +207,7 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order,
thd->lock=0; thd->lock=0;
} }
delete select; delete select;
if (error >= 0) // Fatal error if (error >= 0 || thd->net.report_error)
send_error(thd,thd->killed ? ER_SERVER_SHUTDOWN: 0); send_error(thd,thd->killed ? ER_SERVER_SHUTDOWN: 0);
else else
{ {
......
...@@ -235,9 +235,10 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List<Item> &fields, ...@@ -235,9 +235,10 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List<Item> &fields,
if (fields.elements || !value_count) if (fields.elements || !value_count)
{ {
restore_record(table,2); // Get empty record restore_record(table,2); // Get empty record
if (fill_record(fields,*values) || check_null_fields(thd,table)) if (fill_record(fields,*values)|| thd->net.report_error ||
check_null_fields(thd,table))
{ {
if (values_list.elements != 1) if (values_list.elements != 1 && !thd->net.report_error)
{ {
info.records++; info.records++;
continue; continue;
...@@ -252,9 +253,9 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List<Item> &fields, ...@@ -252,9 +253,9 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List<Item> &fields,
restore_record(table,2); // Get empty record restore_record(table,2); // Get empty record
else else
table->record[0][0]=table->record[2][0]; // Fix delete marker table->record[0][0]=table->record[2][0]; // Fix delete marker
if (fill_record(table->field,*values)) if (fill_record(table->field,*values) || thd->net.report_error)
{ {
if (values_list.elements != 1) if (values_list.elements != 1 && ! thd->net.report_error)
{ {
info.records++; info.records++;
continue; continue;
...@@ -1349,7 +1350,7 @@ bool select_insert::send_data(List<Item> &values) ...@@ -1349,7 +1350,7 @@ bool select_insert::send_data(List<Item> &values)
fill_record(*fields,values); fill_record(*fields,values);
else else
fill_record(table->field,values); fill_record(table->field,values);
if (write_record(table,&info)) if (thd->net.report_error || write_record(table,&info))
return 1; return 1;
if (table->next_number_field) // Clear for next record if (table->next_number_field) // Clear for next record
{ {
...@@ -1463,7 +1464,7 @@ bool select_create::send_data(List<Item> &values) ...@@ -1463,7 +1464,7 @@ bool select_create::send_data(List<Item> &values)
return 0; return 0;
} }
fill_record(field,values); fill_record(field,values);
if (write_record(table,&info)) if (thd->net.report_error ||write_record(table,&info))
return 1; return 1;
if (table->next_number_field) // Clear for next record if (table->next_number_field) // Clear for next record
{ {
......
...@@ -458,7 +458,7 @@ int yylex(void *arg, void *yythd) ...@@ -458,7 +458,7 @@ int yylex(void *arg, void *yythd)
LINT_INIT(c); LINT_INIT(c);
for (;;) for (;;)
{ {
switch(state) { switch (state) {
case STATE_OPERATOR_OR_IDENT: // Next is operator or keyword case STATE_OPERATOR_OR_IDENT: // Next is operator or keyword
case STATE_START: // Start of token case STATE_START: // Start of token
// Skip startspace // Skip startspace
...@@ -900,7 +900,8 @@ int yylex(void *arg, void *yythd) ...@@ -900,7 +900,8 @@ int yylex(void *arg, void *yythd)
return((int) '@'); return((int) '@');
case STATE_HOSTNAME: // end '@' of user@hostname case STATE_HOSTNAME: // end '@' of user@hostname
for (c=yyGet() ; for (c=yyGet() ;
my_isalnum(system_charset_info,c) || c == '.' || c == '_' || c == '$'; my_isalnum(system_charset_info,c) || c == '.' || c == '_' ||
c == '$';
c= yyGet()) ; c= yyGet()) ;
yylval->lex_str=get_token(lex,yyLength()); yylval->lex_str=get_token(lex,yyLength());
return(LEX_HOSTNAME); return(LEX_HOSTNAME);
......
...@@ -1900,6 +1900,8 @@ mysql_execute_command(THD *thd) ...@@ -1900,6 +1900,8 @@ mysql_execute_command(THD *thd)
(ORDER *) select_lex->order_list.first, (ORDER *) select_lex->order_list.first,
select_lex->select_limit, select_lex->select_limit,
lex->duplicates); lex->duplicates);
if (thd->net.report_error)
res= -1;
break; break;
case SQLCOM_UPDATE_MULTI: case SQLCOM_UPDATE_MULTI:
if (check_access(thd,UPDATE_ACL,tables->db,&tables->grant.privilege)) if (check_access(thd,UPDATE_ACL,tables->db,&tables->grant.privilege))
...@@ -1959,6 +1961,8 @@ mysql_execute_command(THD *thd) ...@@ -1959,6 +1961,8 @@ mysql_execute_command(THD *thd)
SELECT_NO_JOIN_CACHE, SELECT_NO_JOIN_CACHE,
result, unit, select_lex, 0); result, unit, select_lex, 0);
delete result; delete result;
if (thd->net.report_error)
res= -1;
} }
else else
res= -1; // Error is not sent res= -1; // Error is not sent
...@@ -1976,6 +1980,8 @@ mysql_execute_command(THD *thd) ...@@ -1976,6 +1980,8 @@ mysql_execute_command(THD *thd)
goto error; goto error;
res = mysql_insert(thd,tables,lex->field_list,lex->many_values, res = mysql_insert(thd,tables,lex->field_list,lex->many_values,
lex->duplicates); lex->duplicates);
if (thd->net.report_error)
res= -1;
break; break;
} }
case SQLCOM_REPLACE_SELECT: case SQLCOM_REPLACE_SELECT:
...@@ -2020,6 +2026,8 @@ mysql_execute_command(THD *thd) ...@@ -2020,6 +2026,8 @@ mysql_execute_command(THD *thd)
if ((result=new select_insert(tables->table,&lex->field_list, if ((result=new select_insert(tables->table,&lex->field_list,
lex->duplicates))) lex->duplicates)))
res=handle_select(thd,lex,result); res=handle_select(thd,lex,result);
if (thd->net.report_error)
res= -1;
} }
else else
res= -1; res= -1;
...@@ -2050,6 +2058,8 @@ mysql_execute_command(THD *thd) ...@@ -2050,6 +2058,8 @@ mysql_execute_command(THD *thd)
res = mysql_delete(thd,tables, select_lex->where, res = mysql_delete(thd,tables, select_lex->where,
(ORDER*) select_lex->order_list.first, (ORDER*) select_lex->order_list.first,
select_lex->select_limit, select_lex->options); select_lex->select_limit, select_lex->options);
if (thd->net.report_error)
res= -1;
break; break;
} }
case SQLCOM_DELETE_MULTI: case SQLCOM_DELETE_MULTI:
...@@ -2122,6 +2132,8 @@ mysql_execute_command(THD *thd) ...@@ -2122,6 +2132,8 @@ mysql_execute_command(THD *thd)
select_lex->options | thd->options | select_lex->options | thd->options |
SELECT_NO_JOIN_CACHE, SELECT_NO_JOIN_CACHE,
result, unit, select_lex, 0); result, unit, select_lex, 0);
if (thd->net.report_error)
res= -1;
delete result; delete result;
} }
else else
......
...@@ -4115,6 +4115,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields, ...@@ -4115,6 +4115,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
keyinfo->usable_key_parts=keyinfo->key_parts= param->group_parts; keyinfo->usable_key_parts=keyinfo->key_parts= param->group_parts;
keyinfo->key_length=0; keyinfo->key_length=0;
keyinfo->rec_per_key=0; keyinfo->rec_per_key=0;
keyinfo->algorithm= HA_KEY_ALG_UNDEF;
for (; group ; group=group->next,key_part_info++) for (; group ; group=group->next,key_part_info++)
{ {
Field *field=(*group->item)->tmp_table_field(); Field *field=(*group->item)->tmp_table_field();
...@@ -4191,6 +4192,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields, ...@@ -4191,6 +4192,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
keyinfo->flags=HA_NOSAME | HA_NULL_ARE_EQUAL; keyinfo->flags=HA_NOSAME | HA_NULL_ARE_EQUAL;
keyinfo->key_length=(uint16) reclength; keyinfo->key_length=(uint16) reclength;
keyinfo->name=(char*) "tmp"; keyinfo->name=(char*) "tmp";
keyinfo->algorithm= HA_KEY_ALG_UNDEF;
if (null_pack_length) if (null_pack_length)
{ {
key_part_info->null_bit=0; key_part_info->null_bit=0;
......
...@@ -76,7 +76,7 @@ bool select_union::send_data(List<Item> &values) ...@@ -76,7 +76,7 @@ bool select_union::send_data(List<Item> &values)
return 0; return 0;
} }
fill_record(table->field,values); fill_record(table->field,values);
if ((write_record(table,&info))) if (thd->net.report_error || write_record(table,&info))
{ {
if (thd->net.last_errno == ER_RECORD_FILE_FULL) if (thd->net.last_errno == ER_RECORD_FILE_FULL)
{ {
......
...@@ -281,7 +281,7 @@ int mysql_update(THD *thd, ...@@ -281,7 +281,7 @@ int mysql_update(THD *thd,
if (!(select && select->skipp_record())) if (!(select && select->skipp_record()))
{ {
store_record(table,1); store_record(table,1);
if (fill_record(fields,values)) if (fill_record(fields,values) || thd->net.report_error)
break; /* purecov: inspected */ break; /* purecov: inspected */
found++; found++;
if (compare_record(table, query_id)) if (compare_record(table, query_id))
...@@ -605,7 +605,7 @@ bool multi_update::send_data(List<Item> &values) ...@@ -605,7 +605,7 @@ bool multi_update::send_data(List<Item> &values)
// Only one table being updated receives a completely different treatment // Only one table being updated receives a completely different treatment
table->status|= STATUS_UPDATED; table->status|= STATUS_UPDATED;
store_record(table,1); store_record(table,1);
if (fill_record(fields,real_values)) if (fill_record(fields,real_values) || thd->net.report_error)
return 1; return 1;
found++; found++;
if (/* compare_record(table, query_id) && */ if (/* compare_record(table, query_id) && */
...@@ -644,7 +644,8 @@ bool multi_update::send_data(List<Item> &values) ...@@ -644,7 +644,8 @@ bool multi_update::send_data(List<Item> &values)
{ {
table->status|= STATUS_UPDATED; table->status|= STATUS_UPDATED;
store_record(table,1); store_record(table,1);
if (fill_record(*fields_by_tables[0],values_by_table)) if (fill_record(*fields_by_tables[0], values_by_table) ||
thd->net.report_error)
return 1; return 1;
found++; found++;
if (/*compare_record(table, query_id) && */ if (/*compare_record(table, query_id) && */
...@@ -667,8 +668,8 @@ bool multi_update::send_data(List<Item> &values) ...@@ -667,8 +668,8 @@ bool multi_update::send_data(List<Item> &values)
table->file->ref_length, table->file->ref_length,
system_charset_info)); system_charset_info));
fill_record(tmp_tables[secure_counter]->field,values_by_table); fill_record(tmp_tables[secure_counter]->field,values_by_table);
error= write_record(tmp_tables[secure_counter], error= thd->net.report_error ||
&(infos[secure_counter])); write_record(tmp_tables[secure_counter], &(infos[secure_counter]));
if (error) if (error)
{ {
error=-1; error=-1;
...@@ -774,8 +775,10 @@ int multi_update::do_updates (bool from_send_error) ...@@ -774,8 +775,10 @@ int multi_update::do_updates (bool from_send_error)
table->status|= STATUS_UPDATED; table->status|= STATUS_UPDATED;
store_record(table,1); store_record(table,1);
local_error= (fill_record(*fields_by_tables[counter + 1],list) || local_error= (fill_record(*fields_by_tables[counter + 1],list) ||
thd->net.report_error ||
/* compare_record(table, query_id) || */ /* compare_record(table, query_id) || */
table->file->update_row(table->record[1],table->record[0])); table->file->update_row(table->record[1],
table->record[0]));
if (local_error) if (local_error)
{ {
table->file->print_error(local_error,MYF(0)); table->file->print_error(local_error,MYF(0));
......
...@@ -1979,10 +1979,12 @@ simple_expr: ...@@ -1979,10 +1979,12 @@ simple_expr:
| NOT expr %prec NEG { $$= new Item_func_not($2); } | NOT expr %prec NEG { $$= new Item_func_not($2); }
| '!' expr %prec NEG { $$= new Item_func_not($2); } | '!' expr %prec NEG { $$= new Item_func_not($2); }
| '(' expr ')' { $$= $2; } | '(' expr ')' { $$= $2; }
| '(' expr ',' expr_list ')' /* Note: In SQL-99 "ROW" is optional, but not having it mandatory
causes conflicts with the INTERVAL syntax. */
| ROW_SYM '(' expr ',' expr_list ')'
{ {
$4->push_front($2); $5->push_front($3);
$$= new Item_row(*$4); $$= new Item_row(*$5);
} }
| EXISTS exists_subselect { $$= $2; } | EXISTS exists_subselect { $$= $2; }
| singleval_subselect { $$= $1; } | singleval_subselect { $$= $1; }
...@@ -2680,7 +2682,11 @@ order_dir: ...@@ -2680,7 +2682,11 @@ order_dir:
opt_limit_clause: opt_limit_clause:
/* empty */ {} /* empty */ {}
| LIMIT | limit_clause {}
;
limit_clause:
LIMIT
{ {
LEX *lex= Lex; LEX *lex= Lex;
if (lex->current_select->linkage != GLOBAL_OPTIONS_TYPE && if (lex->current_select->linkage != GLOBAL_OPTIONS_TYPE &&
...@@ -4378,10 +4384,7 @@ union_opt: ...@@ -4378,10 +4384,7 @@ union_opt:
; ;
optional_order_or_limit: optional_order_or_limit:
/* empty /* Empty */ {}
intentional reduce/reduce conflict here !!!
{ code } below should not be executed
when neither ORDER BY nor LIMIT are used */ {}
| |
{ {
LEX *lex=Lex; LEX *lex=Lex;
...@@ -4397,7 +4400,13 @@ optional_order_or_limit: ...@@ -4397,7 +4400,13 @@ optional_order_or_limit:
lex->current_select->select_limit= lex->current_select->select_limit=
lex->thd->variables.select_limit; lex->thd->variables.select_limit;
} }
opt_order_clause opt_limit_clause order_or_limit
;
order_or_limit:
order_clause opt_limit_clause
|
limit_clause
; ;
union_option: union_option:
......
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