| Bug #8733 | server accepts malformed query (multiply mentioned distinct) | ||
|---|---|---|---|
| Submitted: | 23 Feb 2005 15:05 | Modified: | 2 Jul 2005 9:02 |
| Reporter: | Martin Friebe (Gold Quality Contributor) (OCA) | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server | Severity: | S3 (Non-critical) |
| Version: | 4.1.10 | OS: | Any (*) |
| Assigned to: | Konstantin Osipov | CPU Architecture: | Any |
[23 Feb 2005 15:05]
Martin Friebe
[24 Feb 2005 20:34]
Antony Curtis
Option 1, Amend parser to conform to syntax as specified in the manual:
===== sql/sql_yacc.yy 1.379 vs edited =====
--- 1.379/sql/sql_yacc.yy 2005-02-18 13:19:04 +00:00
+++ edited/sql/sql_yacc.yy 2005-02-24 18:41:21 +00:00
@@ -2467,42 +2467,71 @@
;
select_options:
- /* empty*/
- | select_option_list;
+ select_option_distinct
+ select_option_priority
+ select_option_straight
+ select_option_small
+ select_option_big
+ select_option_buffer
+ select_option_cache
+ select_option_calc;
-select_option_list:
- select_option_list select_option
- | select_option;
-
-select_option:
- STRAIGHT_JOIN { Select->options|= SELECT_STRAIGHT_JOIN; }
+select_option_distinct:
+ /* Empty */ {}
+ | ALL {}
+ | DISTINCT { Select->options|= SELECT_DISTINCT; }
+ ;
+select_option_priority:
+ /* Empty */ {}
| HIGH_PRIORITY
{
if (check_simple_select())
YYABORT;
Lex->lock_option= TL_READ_HIGH_PRIORITY;
}
- | DISTINCT { Select->options|= SELECT_DISTINCT; }
+ ;
+
+select_option_straight:
+ /* Empty */ {}
+ | STRAIGHT_JOIN { Select->options|= SELECT_STRAIGHT_JOIN; }
+ ;
+
+select_option_small:
+ /* Empty */ {}
| SQL_SMALL_RESULT { Select->options|= SELECT_SMALL_RESULT; }
+ ;
+select_option_big:
+ /* Empty */ {}
| SQL_BIG_RESULT { Select->options|= SELECT_BIG_RESULT; }
+ ;
+
+select_option_buffer:
+ /* Empty */ {}
| SQL_BUFFER_RESULT
{
if (check_simple_select())
YYABORT;
Select->options|= OPTION_BUFFER_RESULT;
}
+ ;
+
+select_option_calc:
+ /* Empty */ {}
| SQL_CALC_FOUND_ROWS
{
if (check_simple_select())
YYABORT;
Select->options|= OPTION_FOUND_ROWS;
}
+ ;
+
+select_option_cache:
+ /* Empty */ {}
| SQL_NO_CACHE_SYM { Lex->safe_to_cache_query=0; }
| SQL_CACHE_SYM
{
Lex->select_lex.options|= OPTION_TO_QUERY_CACHE;
}
- | ALL {}
;
select_lock_type:
[24 Feb 2005 20:37]
Antony Curtis
Option #2, provide guards on actions - so parser is not sensitive to order of options:
===== sql/sql_yacc.yy 1.379 vs edited =====
--- 1.379/sql/sql_yacc.yy 2005-02-18 13:19:04 +00:00
+++ edited/sql/sql_yacc.yy 2005-02-24 19:24:05 +00:00
@@ -619,7 +619,7 @@
table_option opt_if_not_exists opt_no_write_to_binlog opt_var_type
opt_var_ident_type delete_option opt_temporary all_or_any opt_distinct
opt_ignore_leaves fulltext_options spatial_type union_option
- start_transaction_opts
+ start_transaction_opts select_option_list select_option
%type <ulong_num>
ULONG_NUM raid_types merge_insert_types
@@ -2468,41 +2468,68 @@
select_options:
/* empty*/
- | select_option_list;
+ | select_option_list
+ {
+ uint val= $1 & 0x0000ffff;
+ if (0x00000001 & val)
+ Select->options|= SELECT_STRAIGHT_JOIN;
+ if (0x00000002 & val)
+ Lex->lock_option= TL_READ_HIGH_PRIORITY;
+ if (0x00000004 & val)
+ Select->options|= SELECT_DISTINCT;
+ if (0x00000008 & val)
+ Select->options|= SELECT_SMALL_RESULT;
+ if (0x00000010 & val)
+ Select->options|= SELECT_BIG_RESULT;
+ if (0x00000020 & val)
+ Select->options|= OPTION_BUFFER_RESULT;
+ if (0x00000040 & val)
+ Select->options|= OPTION_FOUND_ROWS;
+ if (0x00000080 & val)
+ Lex->safe_to_cache_query=0;
+ if (0x00000100 & val)
+ Lex->select_lex.options|= OPTION_TO_QUERY_CACHE;
+ }
+ ;
select_option_list:
select_option_list select_option
+ {
+ if (($1 & $2) & 0x7fff0000)
+ {
+ yyerror(ER(ER_SYNTAX_ERROR));
+ YYABORT;
+ }
+ $$= $1 | $2;
+ }
| select_option;
select_option:
- STRAIGHT_JOIN { Select->options|= SELECT_STRAIGHT_JOIN; }
+ STRAIGHT_JOIN { $$= 0x00010001; }
| HIGH_PRIORITY
{
if (check_simple_select())
YYABORT;
- Lex->lock_option= TL_READ_HIGH_PRIORITY;
+ $$= 0x00020002;
}
- | DISTINCT { Select->options|= SELECT_DISTINCT; }
- | SQL_SMALL_RESULT { Select->options|= SELECT_SMALL_RESULT; }
- | SQL_BIG_RESULT { Select->options|= SELECT_BIG_RESULT; }
+ | DISTINCT { $$= 0x00040004; }
+ | SQL_SMALL_RESULT { $$= 0x00080008; }
+ | SQL_BIG_RESULT { $$= 0x00080010; }
| SQL_BUFFER_RESULT
{
if (check_simple_select())
YYABORT;
- Select->options|= OPTION_BUFFER_RESULT;
+ $$= 0x00100020;
}
| SQL_CALC_FOUND_ROWS
{
if (check_simple_select())
YYABORT;
- Select->options|= OPTION_FOUND_ROWS;
- }
- | SQL_NO_CACHE_SYM { Lex->safe_to_cache_query=0; }
- | SQL_CACHE_SYM
- {
- Lex->select_lex.options|= OPTION_TO_QUERY_CACHE;
+ $$= 0x00200040;
}
- | ALL {}
+ | SQL_NO_CACHE_SYM { $$= 0x00400080; }
+ | SQL_CACHE_SYM { $$= 0x00400100; }
+ | ALL { $$= 0x00040000; }
;
select_lock_type:
[12 May 2005 10:43]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/internals/24810
