summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantony@ltantony.mysql.com <>2005-05-09 14:31:46 +0100
committerantony@ltantony.mysql.com <>2005-05-09 14:31:46 +0100
commitcc3bfc6ff1f27e5054715472657fc987c0f85f70 (patch)
treee77d7ae277d388e55273e3ede410ca145b9b3b72
parent9eaf381d03c6335be91ab745efde520a3314c292 (diff)
downloadmariadb-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.result10
-rw-r--r--mysql-test/t/select.test16
-rw-r--r--sql/mysql_priv.h3
-rw-r--r--sql/sql_yacc.yy20
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: