summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleksandr Byelkin <sanja@mariadb.com>2017-08-07 13:42:35 +0200
committerOleksandr Byelkin <sanja@mariadb.com>2017-08-09 17:57:21 +0200
commit7d9033a524bfbedcdb9c1afcc4fe904cbb57531d (patch)
tree3b4e71ca75faf17d8a716614a3a8acdbd452abf5
parent86f9b7714791f45f386e9aaa6f469ada626cd69d (diff)
downloadmariadb-git-bb-10.2-MDEV-13439.tar.gz
MDEV-13439: Database permissions are not enough to run a subquery with GROUP BY within a viewbb-10.2-MDEV-13439
The bug is result adding ability to have derived tables inside views. Fixed checks should be a switch between view/derived or select derived and information schema.
-rw-r--r--mysql-test/r/view.result19
-rw-r--r--mysql-test/t/view.test25
-rw-r--r--sql/sql_acl.cc5
-rw-r--r--sql/sql_derived.cc7
4 files changed, 52 insertions, 4 deletions
diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result
index 1fae4e6ec9f..e0bc7b3d984 100644
--- a/mysql-test/r/view.result
+++ b/mysql-test/r/view.result
@@ -6559,5 +6559,24 @@ Warnings:
Warning 1356 View 'test.v' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
DROP VIEW v;
#
+# MDEV-13439: Database permissions are not enough to run a subquery
+# with GROUP BY within a view
+#
+create database test_db;
+use test_db;
+create table t (i int);
+create user foo@localhost;
+grant all on test_db.* to foo@localhost;
+connect con1,localhost,foo,,;
+use test_db;
+create view v as select * from (select i from t group by i) sq;
+select * from v;
+i
+disconnect con1;
+connection default;
+use test;
+drop database test_db;
+drop user foo@localhost;
+#
# End of 10.2 tests
#
diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test
index 4430b65e5f4..47dc62c1b96 100644
--- a/mysql-test/t/view.test
+++ b/mysql-test/t/view.test
@@ -6269,5 +6269,30 @@ SHOW CREATE VIEW v;
DROP VIEW v;
--echo #
+--echo # MDEV-13439: Database permissions are not enough to run a subquery
+--echo # with GROUP BY within a view
+--echo #
+
+create database test_db;
+use test_db;
+create table t (i int);
+
+create user foo@localhost;
+grant all on test_db.* to foo@localhost;
+
+--connect (con1,localhost,foo,,)
+
+use test_db;
+create view v as select * from (select i from t group by i) sq;
+select * from v;
+
+# Cleanup
+--disconnect con1
+--connection default
+use test;
+drop database test_db;
+drop user foo@localhost;
+
+--echo #
--echo # End of 10.2 tests
--echo #
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index 77f502d3a7b..6032c7a9742 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -7594,8 +7594,11 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables,
/*
It is subquery in the FROM clause. VIEW set t_ref->derived after
table opening, but this function always called before table opening.
+
+ NOTE: is_derived() can't be used here because subquery in this case
+ the FROM clase (derived tables) can be not be marked yet.
*/
- if (!t_ref->referencing_view)
+ if (t_ref->is_anonymous_derived_table() || t_ref->schema_table)
{
/*
If it's a temporary table created for a subquery in the FROM
diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc
index 649f745fdc4..f788d35a297 100644
--- a/sql/sql_derived.cc
+++ b/sql/sql_derived.cc
@@ -822,13 +822,14 @@ exit:
table->derived_select_number= first_select->select_number;
table->s->tmp_table= INTERNAL_TMP_TABLE;
#ifndef NO_EMBEDDED_ACCESS_CHECKS
- if (derived->referencing_view)
+ if (derived->is_view())
table->grant= derived->grant;
else
{
+ DBUG_ASSERT(derived->is_derived());
+ DBUG_ASSERT(derived->is_anonymous_derived_table());
table->grant.privilege= SELECT_ACL;
- if (derived->is_derived())
- derived->grant.privilege= SELECT_ACL;
+ derived->grant.privilege= SELECT_ACL;
}
#endif
/* Add new temporary table to list of open derived tables */