summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <evgen@moonbone.local>2006-11-29 15:03:53 +0300
committerunknown <evgen@moonbone.local>2006-11-29 15:03:53 +0300
commit004aadd6f716e2bdd055a2518b50bd8d13e961e8 (patch)
tree8a4b4dbca4f569565f89a30bab47a7700d15da81
parenta116f93dd32cdd0bc29e66f93ad71fc12727e3d3 (diff)
parentfe499575af62bebdc42f804645da089f8e268bc4 (diff)
downloadmariadb-git-004aadd6f716e2bdd055a2518b50bd8d13e961e8.tar.gz
Merge epotemkin@bk-internal.mysql.com:/home/bk/mysql-5.0-opt
into moonbone.local:/work/20327-bug-5.0-opt-mysql sql/sql_base.cc: Auto merged mysql-test/r/ps.result: Manual merge mysql-test/t/ps.test: Manual merge
-rw-r--r--mysql-test/r/ps.result18
-rw-r--r--mysql-test/t/ps.test23
-rw-r--r--sql/sql_base.cc6
3 files changed, 47 insertions, 0 deletions
diff --git a/mysql-test/r/ps.result b/mysql-test/r/ps.result
index 003e57edb8e..cd7f5683bd5 100644
--- a/mysql-test/r/ps.result
+++ b/mysql-test/r/ps.result
@@ -1475,6 +1475,24 @@ i
1
DEALLOCATE PREPARE stmt;
DROP TABLE t1, t2;
+CREATE TABLE t1 (i INT);
+CREATE VIEW v1 AS SELECT * FROM t1;
+INSERT INTO t1 VALUES (1), (2);
+SELECT t1.i FROM t1 JOIN v1 ON t1.i = v1.i
+WHERE EXISTS (SELECT * FROM t1 WHERE v1.i = 1);
+i
+1
+PREPARE stmt FROM "SELECT t1.i FROM t1 JOIN v1 ON t1.i = v1.i
+WHERE EXISTS (SELECT * FROM t1 WHERE v1.i = 1)";
+EXECUTE stmt;
+i
+1
+EXECUTE stmt;
+i
+1
+DEALLOCATE PREPARE stmt;
+DROP VIEW v1;
+DROP TABLE t1;
DROP PROCEDURE IF EXISTS p1;
flush status;
prepare sq from 'show status like "slow_queries"';
diff --git a/mysql-test/t/ps.test b/mysql-test/t/ps.test
index 8d01277b515..0cb71265d07 100644
--- a/mysql-test/t/ps.test
+++ b/mysql-test/t/ps.test
@@ -1514,6 +1514,29 @@ DROP TABLE t1, t2;
#
+# BUG#20327: Marking of a wrong field leads to a wrong result on select with
+# view, prepared statement and subquery.
+#
+CREATE TABLE t1 (i INT);
+CREATE VIEW v1 AS SELECT * FROM t1;
+
+INSERT INTO t1 VALUES (1), (2);
+
+let $query = SELECT t1.i FROM t1 JOIN v1 ON t1.i = v1.i
+ WHERE EXISTS (SELECT * FROM t1 WHERE v1.i = 1);
+eval $query;
+eval PREPARE stmt FROM "$query";
+# Statement execution should return '1'.
+EXECUTE stmt;
+# Check re-execution.
+EXECUTE stmt;
+
+DEALLOCATE PREPARE stmt;
+DROP VIEW v1;
+DROP TABLE t1;
+
+
+#
# BUG#21856: Prepared Statments: crash if bad create
#
--disable_warnings
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index 7c652fdcd4f..35b36949852 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -3308,6 +3308,12 @@ find_field_in_tables(THD *thd, Item_ident *item,
{
if (found == WRONG_GRANT)
return (Field*) 0;
+
+ /*
+ Only views fields should be marked as dependent, not an underlying
+ fields.
+ */
+ if (!table_ref->belong_to_view)
{
SELECT_LEX *current_sel= thd->lex->current_select;
SELECT_LEX *last_select= table_ref->select_lex;