diff options
author | antony@ltantony.mysql.com <> | 2005-05-09 14:31:46 +0100 |
---|---|---|
committer | antony@ltantony.mysql.com <> | 2005-05-09 14:31:46 +0100 |
commit | cc3bfc6ff1f27e5054715472657fc987c0f85f70 (patch) | |
tree | e77d7ae277d388e55273e3ede410ca145b9b3b72 | |
parent | 9eaf381d03c6335be91ab745efde520a3314c292 (diff) | |
download | mariadb-git-cc3bfc6ff1f27e5054715472657fc987c0f85f70.tar.gz |
Bug#8733 - server accepts malformed query (multiply mentioned distinct)
Detect conflicting options in SELECT
-rw-r--r-- | mysql-test/r/select.result | 10 | ||||
-rw-r--r-- | mysql-test/t/select.test | 16 | ||||
-rw-r--r-- | sql/mysql_priv.h | 3 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 20 |
4 files changed, 47 insertions, 2 deletions
diff --git a/mysql-test/r/select.result b/mysql-test/r/select.result index 9df5efc66d6..50300ed9b76 100644 --- a/mysql-test/r/select.result +++ b/mysql-test/r/select.result @@ -2445,3 +2445,13 @@ cast((a - b) as unsigned) 1 18446744073709551615 drop table t1; +create table t1 (a int(11)); +select all all * from t1; +a +select distinct distinct * from t1; +a +select all distinct * from t1; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'distinct * from t1' at line 1 +select distinct all * from t1; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'all * from t1' at line 1 +drop table t1; diff --git a/mysql-test/t/select.test b/mysql-test/t/select.test index f58a78205ec..6d6d5f6b6e1 100644 --- a/mysql-test/t/select.test +++ b/mysql-test/t/select.test @@ -1979,3 +1979,19 @@ select a-b , (a-b < 0) from t1 order by 1; select a-b as d, (a-b >= 0), b from t1 group by b having d >= 0; select cast((a - b) as unsigned) from t1 order by 1; drop table t1; + + +# +# Bug#8733 server accepts malformed query (multiply mentioned distinct) +# +create table t1 (a int(11)); +select all all * from t1; +select distinct distinct * from t1; +--error 1064 +select all distinct * from t1; +--error 1064 +select distinct all * from t1; +drop table t1; + + +# diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index f5d4464ce68..ca282ee2444 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -211,6 +211,9 @@ extern CHARSET_INFO *national_charset_info, *table_alias_charset; key checks in some cases */ #define OPTION_RELAXED_UNIQUE_CHECKS (1L << 27) #define SELECT_NO_UNLOCK (1L << 28) +/* Thr following is used to detect a conflict with DISTINCT + in the user query has requested */ +#define SELECT_ALL (1L << 29) /* If set to 0, then the thread will ignore all warnings with level notes. Set by executing SET SQL_NOTES=1 */ diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 594077dd4f3..a5e3cd1243c 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2481,7 +2481,15 @@ select_option: YYABORT; Lex->lock_option= TL_READ_HIGH_PRIORITY; } - | DISTINCT { Select->options|= SELECT_DISTINCT; } + | DISTINCT + { + if (Select->options & SELECT_ALL) + { + yyerror(ER(ER_SYNTAX_ERROR)); + YYABORT; + } + Select->options|= SELECT_DISTINCT; + } | SQL_SMALL_RESULT { Select->options|= SELECT_SMALL_RESULT; } | SQL_BIG_RESULT { Select->options|= SELECT_BIG_RESULT; } | SQL_BUFFER_RESULT @@ -2501,7 +2509,15 @@ select_option: { Lex->select_lex.options|= OPTION_TO_QUERY_CACHE; } - | ALL {} + | ALL + { + if (Select->options & SELECT_DISTINCT) + { + yyerror(ER(ER_SYNTAX_ERROR)); + YYABORT; + } + Select->options|= SELECT_ALL; + } ; select_lock_type: |