mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Merge sinisa@work.mysql.com:/home/bk/mysql-4.1
into sinisa.nasamreza.org:/mnt/work/mysql-4.1
This commit is contained in:
@ -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)
|
|||||||
/* 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)
|
|||||||
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)
|
|||||||
/* 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
|
|||||||
# 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
|
|||||||
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=;;"`
|
||||||
|
@ -1,60 +1,60 @@
|
|||||||
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
|
|||||||
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
|
|||||||
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
|
|||||||
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
|
|||||||
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
|
|||||||
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
|
|||||||
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;
|
|||||||
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;
|
||||||
|
@ -1,33 +1,33 @@
|
|||||||
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);
|
|||||||
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;
|
|||||||
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;
|
|||||||
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;
|
|||||||
#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;
|
|||||||
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
|
|||||||
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);
|
|||||||
-- 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)
|
|||||||
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 @@ public:
|
|||||||
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),
|
|||||||
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),
|
|||||||
|
|
||||||
void THD::init(void)
|
void THD::init(void)
|
||||||
{
|
{
|
||||||
server_status= SERVER_STATUS_AUTOCOMMIT;
|
|
||||||
update_lock_default= (variables.low_priority_updates ?
|
|
||||||
TL_WRITE_LOW_PRIORITY :
|
|
||||||
TL_WRITE);
|
|
||||||
options= thd_startup_options;
|
|
||||||
sql_mode=(uint) opt_sql_mode;
|
|
||||||
open_options=ha_open_options;
|
|
||||||
pthread_mutex_lock(&LOCK_global_system_variables);
|
pthread_mutex_lock(&LOCK_global_system_variables);
|
||||||
variables= global_system_variables;
|
variables= global_system_variables;
|
||||||
pthread_mutex_unlock(&LOCK_global_system_variables);
|
pthread_mutex_unlock(&LOCK_global_system_variables);
|
||||||
|
server_status= SERVER_STATUS_AUTOCOMMIT;
|
||||||
|
options= thd_startup_options;
|
||||||
|
sql_mode=(uint) opt_sql_mode;
|
||||||
|
open_options=ha_open_options;
|
||||||
|
update_lock_default= (variables.low_priority_updates ?
|
||||||
|
TL_WRITE_LOW_PRIORITY :
|
||||||
|
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)
|
|||||||
{
|
{
|
||||||
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()
|
|||||||
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,
|
|||||||
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 @@ cleanup:
|
|||||||
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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
(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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
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,
|
|||||||
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)
|
|||||||
// 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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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)
|
|||||||
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:
|
|||||||
| 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:
|
|||||||
|
|
||||||
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:
|
|||||||
;
|
;
|
||||||
|
|
||||||
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:
|
|||||||
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:
|
||||||
|
Reference in New Issue
Block a user