summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Babaev <igor@askmonty.org>2018-02-06 08:26:50 -0800
committerIgor Babaev <igor@askmonty.org>2018-02-06 08:26:50 -0800
commit90885985b6e74c64a19180a561d7e59155938d45 (patch)
tree7f6d792ca1b899ec2357afb6a2ca27583b469891
parentb4fbb4183b35f921efe079a312b0c1be87866b40 (diff)
downloadmariadb-git-90885985b6e74c64a19180a561d7e59155938d45.tar.gz
Fixed mdev-15120 CTE table should not belong to database, that is in use
When identifying a table name the following should be taken into account: a CTE name cannot be qualified with a database name, otherwise the table name is considered as the name of a non-CTE table.
-rw-r--r--mysql-test/r/cte_nonrecursive.result10
-rw-r--r--mysql-test/t/cte_nonrecursive.test15
-rw-r--r--sql/sql_cte.cc3
3 files changed, 27 insertions, 1 deletions
diff --git a/mysql-test/r/cte_nonrecursive.result b/mysql-test/r/cte_nonrecursive.result
index 4f193384d0f..dc48c1b58dd 100644
--- a/mysql-test/r/cte_nonrecursive.result
+++ b/mysql-test/r/cte_nonrecursive.result
@@ -1369,3 +1369,13 @@ n_nationkey n_name n_regionkey r_regionkey r_name
23 UNITED KINGDOM 3 3 EUROPE
drop view v;
drop table region, nation;
+#
+# MDEV-15120: cte name used with database name
+#
+WITH cte AS (SELECT 1 AS a) SELECT test.cte.a FROM test.cte;
+ERROR 42S02: Table 'test.cte' doesn't exist
+CREATE DATABASE db1;
+USE db1;
+WITH cte AS (SELECT 1 AS a) SELECT db1.cte.a FROM db1.cte;
+ERROR 42S02: Table 'db1.cte' doesn't exist
+DROP DATABASE db1;
diff --git a/mysql-test/t/cte_nonrecursive.test b/mysql-test/t/cte_nonrecursive.test
index a092a161277..1af91dd38c0 100644
--- a/mysql-test/t/cte_nonrecursive.test
+++ b/mysql-test/t/cte_nonrecursive.test
@@ -929,3 +929,18 @@ select * from v;
drop view v;
drop table region, nation;
+
+--echo #
+--echo # MDEV-15120: cte name used with database name
+--echo #
+
+--error ER_NO_SUCH_TABLE
+WITH cte AS (SELECT 1 AS a) SELECT test.cte.a FROM test.cte;
+
+CREATE DATABASE db1;
+USE db1;
+
+--error ER_NO_SUCH_TABLE
+WITH cte AS (SELECT 1 AS a) SELECT db1.cte.a FROM db1.cte;
+
+DROP DATABASE db1;
diff --git a/sql/sql_cte.cc b/sql/sql_cte.cc
index ecb984cb2ce..461369bdd1d 100644
--- a/sql/sql_cte.cc
+++ b/sql/sql_cte.cc
@@ -223,7 +223,8 @@ With_element *With_clause::find_table_def(TABLE_LIST *table,
with_elem= with_elem->next)
{
if (my_strcasecmp(system_charset_info, with_elem->query_name->str,
- table->table_name) == 0)
+ table->table_name) == 0 &&
+ !table->is_fqtn)
{
table->set_derived();
return with_elem;