mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
MDEV-10095 Fix derived tables to return a syntax error instead of "Illegal usage of UNION and LIMIT"
This commit is contained in:
@ -1476,7 +1476,7 @@ DROP TABLE t1,t2,t3,t4,t5;
|
||||
# MDEV-4752: Segfault during parsing of illegal query
|
||||
#
|
||||
SELECT * FROM t5 JOIN (t1 JOIN t2 UNION SELECT * FROM t3 JOIN t4);
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')' at line 1
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT * FROM t3 JOIN t4)' at line 1
|
||||
#
|
||||
# MDEV-4959: join of const table with NULL fields
|
||||
#
|
||||
|
@ -822,19 +822,19 @@ ERROR 42000: You have an error in your SQL syntax; check the manual that corresp
|
||||
SELECT (SELECT 1 FROM t1 ORDER BY 1 UNION SELECT 1 FROM t1);
|
||||
ERROR HY000: Incorrect usage of UNION and ORDER BY
|
||||
SELECT 1 FROM (SELECT 1 FROM t1 ORDER BY 1 UNION SELECT 1 FROM t1) a;
|
||||
ERROR HY000: Incorrect usage of UNION and ORDER BY
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UNION SELECT 1 FROM t1) a' at line 1
|
||||
SELECT 1 FROM t1 LIMIT 1 UNION SELECT 1 FROM t1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UNION SELECT 1 FROM t1' at line 1
|
||||
SELECT (SELECT 1 FROM t1 LIMIT 1 UNION SELECT 1 FROM t1);
|
||||
ERROR HY000: Incorrect usage of UNION and LIMIT
|
||||
SELECT 1 FROM (SELECT 1 FROM t1 LIMIT 1 UNION SELECT 1 FROM t1) a;
|
||||
ERROR HY000: Incorrect usage of UNION and LIMIT
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UNION SELECT 1 FROM t1) a' at line 1
|
||||
SELECT 1 FROM t1 ORDER BY 1 LIMIT 1 UNION SELECT 1 FROM t1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UNION SELECT 1 FROM t1' at line 1
|
||||
SELECT (SELECT 1 FROM t1 ORDER BY 1 LIMIT 1 UNION SELECT 1 FROM t1);
|
||||
ERROR HY000: Incorrect usage of UNION and ORDER BY
|
||||
SELECT 1 FROM (SELECT 1 FROM t1 ORDER BY 1 LIMIT 1 UNION SELECT 1 FROM t1) a;
|
||||
ERROR HY000: Incorrect usage of UNION and ORDER BY
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UNION SELECT 1 FROM t1) a' at line 1
|
||||
SELECT 1 FROM t1 LIMIT 1 ORDER BY 1 UNION SELECT 1 FROM t1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ORDER BY 1 UNION SELECT 1 FROM t1' at line 1
|
||||
SELECT (SELECT 1 FROM t1 LIMIT 1 ORDER BY 1 UNION SELECT 1 FROM t1);
|
||||
@ -846,25 +846,25 @@ ERROR 42000: You have an error in your SQL syntax; check the manual that corresp
|
||||
SELECT (SELECT 1 FROM t1 ORDER BY 1 UNION SELECT 1 FROM t1 ORDER BY 1);
|
||||
ERROR HY000: Incorrect usage of UNION and ORDER BY
|
||||
SELECT 1 FROM (SELECT 1 FROM t1 ORDER BY 1 UNION SELECT 1 FROM t1 ORDER BY 1) a;
|
||||
ERROR HY000: Incorrect usage of UNION and ORDER BY
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UNION SELECT 1 FROM t1 ORDER BY 1) a' at line 1
|
||||
SELECT 1 FROM t1 LIMIT 1 UNION SELECT 1 FROM t1 LIMIT 1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UNION SELECT 1 FROM t1 LIMIT 1' at line 1
|
||||
SELECT (SELECT 1 FROM t1 LIMIT 1 UNION SELECT 1 FROM t1 LIMIT 1);
|
||||
ERROR HY000: Incorrect usage of UNION and LIMIT
|
||||
SELECT 1 FROM (SELECT 1 FROM t1 LIMIT 1 UNION SELECT 1 FROM t1 LIMIT 1) a;
|
||||
ERROR HY000: Incorrect usage of UNION and LIMIT
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UNION SELECT 1 FROM t1 LIMIT 1) a' at line 1
|
||||
SELECT 1 FROM t1 LIMIT 1 UNION SELECT 1 FROM t1 ORDER BY 1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UNION SELECT 1 FROM t1 ORDER BY 1' at line 1
|
||||
SELECT (SELECT 1 FROM t1 LIMIT 1 UNION SELECT 1 FROM t1 ORDER BY 1);
|
||||
ERROR HY000: Incorrect usage of UNION and LIMIT
|
||||
SELECT 1 FROM (SELECT 1 FROM t1 LIMIT 1 UNION SELECT 1 FROM t1 ORDER BY 1) a;
|
||||
ERROR HY000: Incorrect usage of UNION and LIMIT
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UNION SELECT 1 FROM t1 ORDER BY 1) a' at line 1
|
||||
SELECT 1 FROM t1 ORDER BY 1 UNION SELECT 1 FROM t1 LIMIT 1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UNION SELECT 1 FROM t1 LIMIT 1' at line 1
|
||||
SELECT (SELECT 1 FROM t1 ORDER BY 1 UNION SELECT 1 FROM t1 LIMIT 1);
|
||||
ERROR HY000: Incorrect usage of UNION and ORDER BY
|
||||
SELECT 1 FROM (SELECT 1 FROM t1 ORDER BY 1 UNION SELECT 1 FROM t1 LIMIT 1) a;
|
||||
ERROR HY000: Incorrect usage of UNION and ORDER BY
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UNION SELECT 1 FROM t1 LIMIT 1) a' at line 1
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV-8380: Subquery parse error
|
||||
|
@ -5188,9 +5188,9 @@ a 1
|
||||
SELECT * FROM t1 JOIN ((SELECT 1 UNION SELECT 1)) ON 1;
|
||||
ERROR 42000: Every derived table must have its own alias
|
||||
SELECT * FROM t1 JOIN (t1 t1a UNION SELECT 1) ON 1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') ON 1' at line 1
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT 1) ON 1' at line 1
|
||||
SELECT * FROM t1 JOIN ((t1 t1a UNION SELECT 1)) ON 1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')) ON 1' at line 1
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT 1)) ON 1' at line 1
|
||||
SELECT * FROM t1 JOIN (t1 t1a) t1a ON 1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 't1a ON 1' at line 1
|
||||
SELECT * FROM t1 JOIN ((t1 t1a)) t1a ON 1;
|
||||
|
@ -5190,9 +5190,9 @@ a 1
|
||||
SELECT * FROM t1 JOIN ((SELECT 1 UNION SELECT 1)) ON 1;
|
||||
ERROR 42000: Every derived table must have its own alias
|
||||
SELECT * FROM t1 JOIN (t1 t1a UNION SELECT 1) ON 1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') ON 1' at line 1
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT 1) ON 1' at line 1
|
||||
SELECT * FROM t1 JOIN ((t1 t1a UNION SELECT 1)) ON 1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')) ON 1' at line 1
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT 1)) ON 1' at line 1
|
||||
SELECT * FROM t1 JOIN (t1 t1a) t1a ON 1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 't1a ON 1' at line 1
|
||||
SELECT * FROM t1 JOIN ((t1 t1a)) t1a ON 1;
|
||||
|
@ -5188,9 +5188,9 @@ a 1
|
||||
SELECT * FROM t1 JOIN ((SELECT 1 UNION SELECT 1)) ON 1;
|
||||
ERROR 42000: Every derived table must have its own alias
|
||||
SELECT * FROM t1 JOIN (t1 t1a UNION SELECT 1) ON 1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') ON 1' at line 1
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT 1) ON 1' at line 1
|
||||
SELECT * FROM t1 JOIN ((t1 t1a UNION SELECT 1)) ON 1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')) ON 1' at line 1
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT 1)) ON 1' at line 1
|
||||
SELECT * FROM t1 JOIN (t1 t1a) t1a ON 1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 't1a ON 1' at line 1
|
||||
SELECT * FROM t1 JOIN ((t1 t1a)) t1a ON 1;
|
||||
|
@ -5184,9 +5184,9 @@ a 1
|
||||
SELECT * FROM t1 JOIN ((SELECT 1 UNION SELECT 1)) ON 1;
|
||||
ERROR 42000: Every derived table must have its own alias
|
||||
SELECT * FROM t1 JOIN (t1 t1a UNION SELECT 1) ON 1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') ON 1' at line 1
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT 1) ON 1' at line 1
|
||||
SELECT * FROM t1 JOIN ((t1 t1a UNION SELECT 1)) ON 1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')) ON 1' at line 1
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT 1)) ON 1' at line 1
|
||||
SELECT * FROM t1 JOIN (t1 t1a) t1a ON 1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 't1a ON 1' at line 1
|
||||
SELECT * FROM t1 JOIN ((t1 t1a)) t1a ON 1;
|
||||
|
@ -5194,9 +5194,9 @@ a 1
|
||||
SELECT * FROM t1 JOIN ((SELECT 1 UNION SELECT 1)) ON 1;
|
||||
ERROR 42000: Every derived table must have its own alias
|
||||
SELECT * FROM t1 JOIN (t1 t1a UNION SELECT 1) ON 1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') ON 1' at line 1
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT 1) ON 1' at line 1
|
||||
SELECT * FROM t1 JOIN ((t1 t1a UNION SELECT 1)) ON 1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')) ON 1' at line 1
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT 1)) ON 1' at line 1
|
||||
SELECT * FROM t1 JOIN (t1 t1a) t1a ON 1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 't1a ON 1' at line 1
|
||||
SELECT * FROM t1 JOIN ((t1 t1a)) t1a ON 1;
|
||||
|
@ -5184,9 +5184,9 @@ a 1
|
||||
SELECT * FROM t1 JOIN ((SELECT 1 UNION SELECT 1)) ON 1;
|
||||
ERROR 42000: Every derived table must have its own alias
|
||||
SELECT * FROM t1 JOIN (t1 t1a UNION SELECT 1) ON 1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') ON 1' at line 1
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT 1) ON 1' at line 1
|
||||
SELECT * FROM t1 JOIN ((t1 t1a UNION SELECT 1)) ON 1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')) ON 1' at line 1
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT 1)) ON 1' at line 1
|
||||
SELECT * FROM t1 JOIN (t1 t1a) t1a ON 1;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 't1a ON 1' at line 1
|
||||
SELECT * FROM t1 JOIN ((t1 t1a)) t1a ON 1;
|
||||
|
@ -951,7 +951,7 @@ let $q=SELECT 1 FROM t1 ORDER BY 1 UNION SELECT 1 FROM t1;
|
||||
eval $q;
|
||||
--error ER_WRONG_USAGE
|
||||
eval SELECT ($q);
|
||||
--error ER_WRONG_USAGE
|
||||
--error ER_PARSE_ERROR
|
||||
eval SELECT 1 FROM ($q) a;
|
||||
|
||||
let $q=SELECT 1 FROM t1 LIMIT 1 UNION SELECT 1 FROM t1;
|
||||
@ -959,7 +959,7 @@ let $q=SELECT 1 FROM t1 LIMIT 1 UNION SELECT 1 FROM t1;
|
||||
eval $q;
|
||||
--error ER_WRONG_USAGE
|
||||
eval SELECT ($q);
|
||||
--error ER_WRONG_USAGE
|
||||
--error ER_PARSE_ERROR
|
||||
eval SELECT 1 FROM ($q) a;
|
||||
|
||||
let $q=SELECT 1 FROM t1 ORDER BY 1 LIMIT 1 UNION SELECT 1 FROM t1;
|
||||
@ -967,7 +967,7 @@ let $q=SELECT 1 FROM t1 ORDER BY 1 LIMIT 1 UNION SELECT 1 FROM t1;
|
||||
eval $q;
|
||||
--error ER_WRONG_USAGE
|
||||
eval SELECT ($q);
|
||||
--error ER_WRONG_USAGE
|
||||
--error ER_PARSE_ERROR
|
||||
eval SELECT 1 FROM ($q) a;
|
||||
|
||||
let $q=SELECT 1 FROM t1 LIMIT 1 ORDER BY 1 UNION SELECT 1 FROM t1;
|
||||
@ -983,7 +983,7 @@ let $q=SELECT 1 FROM t1 ORDER BY 1 UNION SELECT 1 FROM t1 ORDER BY 1;
|
||||
eval $q;
|
||||
--error ER_WRONG_USAGE
|
||||
eval SELECT ($q);
|
||||
--error ER_WRONG_USAGE
|
||||
--error ER_PARSE_ERROR
|
||||
eval SELECT 1 FROM ($q) a;
|
||||
|
||||
let $q=SELECT 1 FROM t1 LIMIT 1 UNION SELECT 1 FROM t1 LIMIT 1;
|
||||
@ -991,7 +991,7 @@ let $q=SELECT 1 FROM t1 LIMIT 1 UNION SELECT 1 FROM t1 LIMIT 1;
|
||||
eval $q;
|
||||
--error ER_WRONG_USAGE
|
||||
eval SELECT ($q);
|
||||
--error ER_WRONG_USAGE
|
||||
--error ER_PARSE_ERROR
|
||||
eval SELECT 1 FROM ($q) a;
|
||||
|
||||
let $q=SELECT 1 FROM t1 LIMIT 1 UNION SELECT 1 FROM t1 ORDER BY 1;
|
||||
@ -999,7 +999,7 @@ let $q=SELECT 1 FROM t1 LIMIT 1 UNION SELECT 1 FROM t1 ORDER BY 1;
|
||||
eval $q;
|
||||
--error ER_WRONG_USAGE
|
||||
eval SELECT ($q);
|
||||
--error ER_WRONG_USAGE
|
||||
--error ER_PARSE_ERROR
|
||||
eval SELECT 1 FROM ($q) a;
|
||||
|
||||
let $q=SELECT 1 FROM t1 ORDER BY 1 UNION SELECT 1 FROM t1 LIMIT 1;
|
||||
@ -1007,7 +1007,7 @@ let $q=SELECT 1 FROM t1 ORDER BY 1 UNION SELECT 1 FROM t1 LIMIT 1;
|
||||
eval $q;
|
||||
--error ER_WRONG_USAGE
|
||||
eval SELECT ($q);
|
||||
--error ER_WRONG_USAGE
|
||||
--error ER_PARSE_ERROR
|
||||
eval SELECT 1 FROM ($q) a;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
@ -1882,6 +1882,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
|
||||
table_primary_ident table_primary_derived
|
||||
select_derived derived_table_list
|
||||
select_derived_union
|
||||
derived_query_specification
|
||||
|
||||
%type <date_time_type> date_time_type;
|
||||
%type <interval> interval
|
||||
@ -11113,34 +11114,39 @@ table_primary_derived:
|
||||
subqueries have their own union rules.
|
||||
*/
|
||||
select_derived_union:
|
||||
select_derived opt_union_order_or_limit
|
||||
select_derived
|
||||
| select_derived union_order_or_limit
|
||||
{
|
||||
if ($1 && $2)
|
||||
if ($1)
|
||||
{
|
||||
my_parse_error(thd, ER_SYNTAX_ERROR);
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
}
|
||||
| derived_query_specification
|
||||
opt_order_clause
|
||||
opt_limit_clause
|
||||
opt_select_lock_type
|
||||
{ $$= NULL; }
|
||||
| select_derived_union union_head_non_top query_term
|
||||
| select_derived union_head_non_top
|
||||
{
|
||||
/*
|
||||
Remove from the name resolution context stack the context of the
|
||||
last select in the union.
|
||||
*/
|
||||
Lex->pop_context();
|
||||
if ($1)
|
||||
{
|
||||
my_parse_error(thd, ER_SYNTAX_ERROR);
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
}
|
||||
union_list_derived_part2
|
||||
| derived_query_specification opt_select_lock_type
|
||||
| derived_query_specification order_or_limit opt_select_lock_type
|
||||
| derived_query_specification opt_select_lock_type union_list_derived
|
||||
;
|
||||
|
||||
union_list_derived_part2:
|
||||
query_term_union_not_ready { Lex->pop_context(); }
|
||||
| query_term_union_ready { Lex->pop_context(); }
|
||||
| query_term_union_ready { Lex->pop_context(); } union_list_derived
|
||||
;
|
||||
|
||||
union_list_derived:
|
||||
union_head_non_top union_list_derived_part2
|
||||
;
|
||||
|
||||
if ($1 != NULL)
|
||||
{
|
||||
my_parse_error(thd, ER_SYNTAX_ERROR);
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
}
|
||||
;
|
||||
|
||||
/* The equivalent of select_init2 for nested queries. */
|
||||
select_init2_derived:
|
||||
@ -11206,6 +11212,7 @@ derived_query_specification:
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
}
|
||||
$$= NULL;
|
||||
}
|
||||
;
|
||||
|
||||
@ -16398,12 +16405,18 @@ query_specification:
|
||||
;
|
||||
|
||||
query_term:
|
||||
query_specification
|
||||
opt_order_clause
|
||||
opt_limit_clause
|
||||
opt_select_lock_type
|
||||
query_term_union_ready
|
||||
| query_term_union_not_ready
|
||||
;
|
||||
|
||||
query_term_union_not_ready:
|
||||
query_specification order_or_limit opt_select_lock_type
|
||||
| '(' select_paren_derived ')' union_order_or_limit
|
||||
;
|
||||
|
||||
query_term_union_ready:
|
||||
query_specification opt_select_lock_type
|
||||
| '(' select_paren_derived ')'
|
||||
opt_union_order_or_limit
|
||||
;
|
||||
|
||||
query_expression_body:
|
||||
|
Reference in New Issue
Block a user