summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <igor@rurik.mysql.com>2005-11-02 13:44:58 -0800
committerunknown <igor@rurik.mysql.com>2005-11-02 13:44:58 -0800
commit5fa6dbea5130ca140d0bea43b0d0a553b82cd835 (patch)
treee01d228045f0098813aa9d95c0580a3a9bf7f8c6
parentd6b2fc2f374fb6a014ff13f4f3c88d1bf8d7f07a (diff)
downloadmariadb-git-5fa6dbea5130ca140d0bea43b0d0a553b82cd835.tar.gz
#view.test#:
new file sql_table.cc, handler.h: Fixed bug #14540. Added error mnemonic code HA_ADMIN_NOT_BASE_TABLE to report that an operation cannot be applied for views. view.test, view.result: Added a test case for bug #14540. errmsg.txt: Fixed bug #14540. Added error ER_CHECK_NOT_BASE_TABLE. mysql-test/r/view.result: Added a test case for bug #14540. mysql-test/t/view.test: Added a test case for bug #14540. sql/handler.h: Fixed bug #14540. Added error mnemonic code HA_ADMIN_NOT_BASE_TABLE to report that an operation cannot be applied for views. sql/share/errmsg.txt: Added error ER_CHECK_NOT_BASE_TABLE. sql/sql_table.cc: Fixed bug #14540. Added error mnemonic code HA_ADMIN_NOT_BASE_TABLE to report that an operation cannot be applied for views.
-rw-r--r--mysql-test/r/view.result19
-rw-r--r--mysql-test/t/view.test15
-rw-r--r--sql/handler.h1
-rw-r--r--sql/share/errmsg.txt2
-rw-r--r--sql/sql_table.cc33
5 files changed, 60 insertions, 10 deletions
diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result
index 6f15e7af399..cd35cf4382f 100644
--- a/mysql-test/r/view.result
+++ b/mysql-test/r/view.result
@@ -2323,3 +2323,22 @@ id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 Using where
DROP VIEW v1,v2;
DROP TABLE t1,t2,t3;
+CREATE TABLE t1(id INT) ENGINE=MyISAM;
+CREATE VIEW v1 AS SELECT id FROM t1;
+OPTIMIZE TABLE v1;
+Table Op Msg_type Msg_text
+test.v1 optimize note You cannot apply optimize to a view
+ANALYZE TABLE v1;
+Table Op Msg_type Msg_text
+test.v1 analyze note You cannot apply analyze to a view
+REPAIR TABLE v1;
+Table Op Msg_type Msg_text
+test.v1 repair note You cannot apply repair to a view
+DROP TABLE t1;
+OPTIMIZE TABLE v1;
+Table Op Msg_type Msg_text
+test.v1 optimize note You cannot apply optimize to a view
+Warnings:
+Error 1146 Table 'test.t1' doesn't exist
+Error 1356 View 'test.v1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
+DROP VIEW v1;
diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test
index aa3189bad69..2a941027d63 100644
--- a/mysql-test/t/view.test
+++ b/mysql-test/t/view.test
@@ -2189,4 +2189,19 @@ EXPLAIN SELECT * FROM v2 WHERE a=1;
DROP VIEW v1,v2;
DROP TABLE t1,t2,t3;
+#
+# Bug #14540: OPTIMIZE, ANALYZE, REPAIR applied to not a view
+#
+
+CREATE TABLE t1(id INT) ENGINE=MyISAM;
+CREATE VIEW v1 AS SELECT id FROM t1;
+
+OPTIMIZE TABLE v1;
+ANALYZE TABLE v1;
+REPAIR TABLE v1;
+
+DROP TABLE t1;
+OPTIMIZE TABLE v1;
+
+DROP VIEW v1;
diff --git a/sql/handler.h b/sql/handler.h
index af80f021e75..16eb8dc6f02 100644
--- a/sql/handler.h
+++ b/sql/handler.h
@@ -45,6 +45,7 @@
#define HA_ADMIN_REJECT -6
#define HA_ADMIN_TRY_ALTER -7
#define HA_ADMIN_WRONG_CHECKSUM -8
+#define HA_ADMIN_NOT_BASE_TABLE -9
/* Bits in table_flags() to show what database can do */
diff --git a/sql/share/errmsg.txt b/sql/share/errmsg.txt
index f85bda90e81..0174a1ef98e 100644
--- a/sql/share/errmsg.txt
+++ b/sql/share/errmsg.txt
@@ -5421,3 +5421,5 @@ ER_NO_REFERENCED_ROW_2 23000
eng "Cannot add or update a child row: a foreign key constraint fails (%.192s)"
ER_SP_BAD_VAR_SHADOW 42000
eng "Variable '%-.64s' must be quoted with `...`, or renamed"
+ER_CHECK_NOT_BASE_TABLE 4200
+ eng "You cannot apply %s to a view"
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index b635c44c6dc..80b337e61d5 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -2189,7 +2189,7 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
/* if view are unsupported */
if (table->view && view_operator_func == NULL)
{
- result_code= HA_ADMIN_NOT_IMPLEMENTED;
+ result_code= HA_ADMIN_NOT_BASE_TABLE;
goto send_result;
}
thd->open_options&= ~extra_open_options;
@@ -2324,6 +2324,16 @@ send_result_message:
}
break;
+ case HA_ADMIN_NOT_BASE_TABLE:
+ {
+ char buf[ERRMSGSIZE+20];
+ uint length=my_snprintf(buf, ERRMSGSIZE,
+ ER(ER_CHECK_NOT_BASE_TABLE), operator_name);
+ protocol->store("note", 4, system_charset_info);
+ protocol->store(buf, length, system_charset_info);
+ }
+ break;
+
case HA_ADMIN_OK:
protocol->store("status", 6, system_charset_info);
protocol->store("OK",2, system_charset_info);
@@ -2424,16 +2434,19 @@ send_result_message:
break;
}
}
- if (fatal_error)
- table->table->s->version=0; // Force close of table
- else if (open_for_modify)
+ if (table->table)
{
- pthread_mutex_lock(&LOCK_open);
- remove_table_from_cache(thd, table->table->s->db,
- table->table->s->table_name, RTFC_NO_FLAG);
- pthread_mutex_unlock(&LOCK_open);
- /* May be something modified consequently we have to invalidate cache */
- query_cache_invalidate3(thd, table->table, 0);
+ if (fatal_error)
+ table->table->s->version=0; // Force close of table
+ else if (open_for_modify)
+ {
+ pthread_mutex_lock(&LOCK_open);
+ remove_table_from_cache(thd, table->table->s->db,
+ table->table->s->table_name, RTFC_NO_FLAG);
+ pthread_mutex_unlock(&LOCK_open);
+ /* Something may be modified, that's why we have to invalidate cache */
+ query_cache_invalidate3(thd, table->table, 0);
+ }
}
close_thread_tables(thd);
table->table=0; // For query cache