Below is the list of changes that have just been committed into a local
5.0 repository of uchum. When uchum does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet@stripped, 2007-04-12 23:21:37+05:00, gshchepa@stripped +6 -0
Bug#5507: TRUNCATE does not work with views.
Support of views wasn't implemented for the TRUNCATE statement.
Now TRUNCATE on views has the same semantics as DELETE FROM view:
mysql_truncate() checks whether the table is a view and falls back
to delete if so.
In order to initialize properly the LEX::updatable for a view
st_lex::can_use_merged() now allows usage of merged views for the
TRUNCATE statement.
mysql-test/r/truncate.result@stripped, 2007-04-12 23:16:18+05:00, gshchepa@stripped +27 -0
Added a test case for the Bug#5507: TRUNCATE does not work with views.
mysql-test/r/view.result@stripped, 2007-04-12 23:20:46+05:00, gshchepa@stripped +10 -0
Updated test case for Bug#14540: OPTIMIZE, ANALYZE, REPAIR applied
to not a view.
mysql-test/t/truncate.test@stripped, 2007-04-12 23:17:05+05:00, gshchepa@stripped +32 -0
Added a test case for the Bug#5507: TRUNCATE does not work with views.
mysql-test/t/view.test@stripped, 2007-04-12 23:19:34+05:00, gshchepa@stripped +2 -0
Updated test case for Bug#14540: OPTIMIZE, ANALYZE, REPAIR applied
to not a view.
sql/sql_delete.cc@stripped, 2007-04-12 23:18:27+05:00, gshchepa@stripped +6 -3
Bug#5507: TRUNCATE does not work with views.
1.mysql_truncate() was lacking of check whether the table is view. Added.
2.mysql_truncate() calls mysql_delete(), but mysql_delete() always reports
errors as "DELETE" errors. Fixed.
sql/sql_lex.cc@stripped, 2007-04-12 23:17:23+05:00, gshchepa@stripped +1 -0
Bug#5507: TRUNCATE does not work with views.
can_use_merged() was denying of usage of merged views for a
TRUNCATE statement. This results in improper initialization
of view LEX::updatable. Fixed.
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: gshchepa
# Host: gshchepa.localdomain
# Root: /home/uchum/work/bk-trees/5507-ci
--- 1.195/sql/sql_delete.cc 2007-04-05 11:29:08 +05:00
+++ 1.196/sql/sql_delete.cc 2007-04-12 23:18:27 +05:00
@@ -369,6 +369,8 @@ bool mysql_prepare_delete(THD *thd, TABL
{
Item *fake_conds= 0;
SELECT_LEX *select_lex= &thd->lex->select_lex;
+ const char *operation = thd->lex->sql_command == SQLCOM_TRUNCATE ?
+ "TRUNCATE" : "DELETE";
DBUG_ENTER("mysql_prepare_delete");
List<Item> all_fields;
@@ -383,14 +385,14 @@ bool mysql_prepare_delete(THD *thd, TABL
DBUG_RETURN(TRUE);
if (!table_list->updatable || check_key_in_view(thd, table_list))
{
- my_error(ER_NON_UPDATABLE_TABLE, MYF(0), table_list->alias, "DELETE");
+ my_error(ER_NON_UPDATABLE_TABLE, MYF(0), table_list->alias, operation);
DBUG_RETURN(TRUE);
}
{
TABLE_LIST *duplicate;
if ((duplicate= unique_table(thd, table_list, table_list->next_global, 0)))
{
- update_non_unique_table_error(table_list, "DELETE", duplicate);
+ update_non_unique_table_error(table_list, operation, duplicate);
DBUG_RETURN(TRUE);
}
}
@@ -895,7 +897,8 @@ bool mysql_truncate(THD *thd, TABLE_LIST
if (!dont_send_ok)
{
db_type table_type;
- mysql_frm_type(thd, path, &table_type);
+ if (mysql_frm_type(thd, path, &table_type) == FRMTYPE_VIEW)
+ goto trunc_by_del;
if (table_type == DB_TYPE_UNKNOWN)
{
my_error(ER_NO_SUCH_TABLE, MYF(0),
--- 1.217/sql/sql_lex.cc 2007-03-08 21:29:58 +04:00
+++ 1.218/sql/sql_lex.cc 2007-04-12 23:17:23 +05:00
@@ -1834,6 +1834,7 @@ bool st_lex::can_use_merged()
case SQLCOM_UPDATE_MULTI:
case SQLCOM_DELETE:
case SQLCOM_DELETE_MULTI:
+ case SQLCOM_TRUNCATE:
case SQLCOM_INSERT:
case SQLCOM_INSERT_SELECT:
case SQLCOM_REPLACE:
--- 1.197/mysql-test/r/view.result 2007-03-09 13:37:05 +04:00
+++ 1.198/mysql-test/r/view.result 2007-04-12 23:20:46 +05:00
@@ -2395,6 +2395,16 @@ Table Op Msg_type Msg_text
test.v1 optimize error 'test.v1' is not BASE TABLE
Warnings:
Error 1347 'test.v1' is not BASE TABLE
+ANALYZE TABLE v1;
+Table Op Msg_type Msg_text
+test.v1 analyze error 'test.v1' is not BASE TABLE
+Warnings:
+Error 1347 'test.v1' is not BASE TABLE
+REPAIR TABLE v1;
+Table Op Msg_type Msg_text
+test.v1 repair error 'test.v1' is not BASE TABLE
+Warnings:
+Error 1347 'test.v1' is not BASE TABLE
DROP VIEW v1;
create definer = current_user() sql security invoker view v1 as select 1;
show create view v1;
--- 1.180/mysql-test/t/view.test 2007-03-08 21:42:33 +04:00
+++ 1.181/mysql-test/t/view.test 2007-04-12 23:19:34 +05:00
@@ -2228,6 +2228,8 @@ REPAIR TABLE v1;
DROP TABLE t1;
OPTIMIZE TABLE v1;
+ANALYZE TABLE v1;
+REPAIR TABLE v1;
DROP VIEW v1;
--- 1.11/mysql-test/r/truncate.result 2004-08-24 20:03:12 +05:00
+++ 1.12/mysql-test/r/truncate.result 2007-04-12 23:16:18 +05:00
@@ -53,3 +53,30 @@ a
3
4
drop table t1;
+create table t1 (s1 int);
+insert into t1 (s1) values (1), (2), (3), (4), (5);
+create view v1 as select * from t1;
+truncate table v1;
+select count(*) from t1;
+count(*)
+0
+insert into t1 (s1) values (1), (2), (3), (4), (5);
+create view v2 as select * from t1 where s1 > 3;
+truncate table v2;
+select * from t1;
+s1
+1
+2
+3
+select * from v2;
+s1
+delete from t1;
+create table t2 (s1 int, s2 int);
+create view v3 as select a.s1, b.s2 from t1 a join t2 b on a.s1 = b.s1 where a.s1 > 3;
+truncate table v3;
+ERROR HY000: Can not delete from join view 'test.v3'
+create view v4 as select * from t1 limit 1,1;
+truncate table v4;
+ERROR HY000: The target table v4 of the TRUNCATE is not updatable
+drop view v1, v2, v3, v4;
+drop table t1, t2;
--- 1.12/mysql-test/t/truncate.test 2005-07-28 05:21:50 +05:00
+++ 1.13/mysql-test/t/truncate.test 2007-04-12 23:17:05 +05:00
@@ -52,3 +52,35 @@ SELECT * from t1;
drop table t1;
# End of 4.1 tests
+
+# Test for Bug#5507 "TRUNCATE should work with views"
+
+create table t1 (s1 int);
+
+insert into t1 (s1) values (1), (2), (3), (4), (5);
+create view v1 as select * from t1;
+truncate table v1;
+select count(*) from t1;
+
+insert into t1 (s1) values (1), (2), (3), (4), (5);
+create view v2 as select * from t1 where s1 > 3;
+truncate table v2;
+select * from t1;
+select * from v2;
+delete from t1;
+
+# The following should fail
+create table t2 (s1 int, s2 int);
+create view v3 as select a.s1, b.s2 from t1 a join t2 b on a.s1 = b.s1 where a.s1 > 3;
+--error 1395
+truncate table v3;
+
+# The following should fail
+create view v4 as select * from t1 limit 1,1;
+--error 1288
+truncate table v4;
+
+drop view v1, v2, v3, v4;
+drop table t1, t2;
+
+# End of 5.0 tests
| Thread |
|---|
| • bk commit into 5.0 tree (gshchepa:1.2448) BUG#5507 | gshchepa | 12 Apr |