summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorramil@mysql.com <>2005-05-09 18:50:57 +0500
committerramil@mysql.com <>2005-05-09 18:50:57 +0500
commitac2218795544249f043334604bac7f402782a9d9 (patch)
tree467eba7fd28f240d2765288b5693db89d6f7d2ad
parent8d30d300730699c7f44afcb6e2fb76df6b8e3510 (diff)
parentddf6225def0957de4b6ef7541574ccd4de374a3f (diff)
downloadmariadb-git-ac2218795544249f043334604bac7f402782a9d9.tar.gz
Merge rkalimullin@bk-internal.mysql.com:/home/bk/mysql-4.1
into mysql.com:/home/ram/work/mysql-4.1
-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 73845f7d645..abe7a716a69 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: