diff options
author | unknown <dlenev@mysql.com> | 2004-09-18 01:34:38 +0400 |
---|---|---|
committer | unknown <dlenev@mysql.com> | 2004-09-18 01:34:38 +0400 |
commit | dbee90a7b72521456358fd4e8fe85ea7bb326f5e (patch) | |
tree | bf861c714e2542255c5d6998b4d0f6903f559065 | |
parent | 210829a18331cbbb66c444d300a7b86d10da58f1 (diff) | |
parent | 5c4226718173979968da14a23e73c4729d376a24 (diff) | |
download | mariadb-git-dbee90a7b72521456358fd4e8fe85ea7bb326f5e.tar.gz |
Merge bk-internal.mysql.com:/home/bk/mysql-5.0
into mysql.com:/home/dlenev/src/mysql-5.0-amf
-rw-r--r-- | mysql-test/r/view.result | 27 | ||||
-rw-r--r-- | mysql-test/t/view.test | 34 | ||||
-rw-r--r-- | sql/item.h | 3 | ||||
-rw-r--r-- | sql/item_strfunc.h | 5 | ||||
-rw-r--r-- | sql/sql_insert.cc | 4 | ||||
-rw-r--r-- | sql/sql_update.cc | 5 | ||||
-rw-r--r-- | sql/sql_view.cc | 45 |
7 files changed, 80 insertions, 43 deletions
diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index 2551977200e..00ad31d546f 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -922,14 +922,17 @@ create table mysqltest.v3 (b int); grant create view on mysqltest.v3 to mysqltest_1@localhost; drop table mysqltest.v3; create view mysqltest.v3 as select b from mysqltest.t2; -ERROR 42000: create view command denied to user 'mysqltest_1'@'localhost' for column 'b' in table 'v3' -create table mysqltest.v3 (b int); grant create view, update on mysqltest.v3 to mysqltest_1@localhost; -drop table mysqltest.v3; +drop view mysqltest.v3; create view mysqltest.v3 as select b from mysqltest.t2; -grant select(b) on mysqltest.v3 to mysqltest_1@localhost; +grant create view, update, insert on mysqltest.v3 to mysqltest_1@localhost; drop view mysqltest.v3; create view mysqltest.v3 as select b from mysqltest.t2; +ERROR 42000: create view command denied to user 'mysqltest_1'@'localhost' for column 'b' in table 'v3' +create table mysqltest.v3 (b int); +grant select(b) on mysqltest.v3 to mysqltest_1@localhost; +drop table mysqltest.v3; +create view mysqltest.v3 as select b from mysqltest.t2; ERROR 42000: create view command denied to user 'mysqltest_1'@'localhost' for table 'v3' create view v4 as select b+1 from mysqltest.t2; ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for column 'b' in table 't2' @@ -1311,3 +1314,19 @@ a a a 3 3 3 drop view v1; drop table t1; +create table t1 (s1 char); +create view v1 as select s1 collate latin1_german1_ci as s1 from t1; +insert into v1 values ('a'); +select * from v1; +s1 +a +update v1 set s1='b'; +select * from v1; +s1 +b +update v1,t1 set v1.s1='c' where t1.s1=v1.s1; +select * from v1; +s1 +c +drop view v1; +drop table t1; diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index 682646a6c02..4c348e0b9d8 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -804,29 +804,37 @@ create view mysqltest.v1 as select * from mysqltest.t1; -- error 1143 create view v3 as select a from mysqltest.t2; -# give CRETEA VIEW privileges but without any privileges for result colemn +# give CRETEA VIEW privileges (without any privileges for result colemn) connection root; create table mysqltest.v3 (b int); grant create view on mysqltest.v3 to mysqltest_1@localhost; drop table mysqltest.v3; connection user1; --- error 1143 create view mysqltest.v3 as select b from mysqltest.t2; -# give UPDATE privileges -> create works +# give UPDATE privileges connection root; -create table mysqltest.v3 (b int); grant create view, update on mysqltest.v3 to mysqltest_1@localhost; -drop table mysqltest.v3; +drop view mysqltest.v3; connection user1; create view mysqltest.v3 as select b from mysqltest.t2; +# give UPDATE and INSERT privilege (to get more privileges then anderlying +# table) +connection root; +grant create view, update, insert on mysqltest.v3 to mysqltest_1@localhost; +drop view mysqltest.v3; +connection user1; +-- error 1143 +create view mysqltest.v3 as select b from mysqltest.t2; + # If give other privileges for VIEW then underlaying table have => # creation prohibited connection root; +create table mysqltest.v3 (b int); grant select(b) on mysqltest.v3 to mysqltest_1@localhost; -drop view mysqltest.v3; +drop table mysqltest.v3; connection user1; -- error 1142 create view mysqltest.v3 as select b from mysqltest.t2; @@ -1271,3 +1279,17 @@ select * from t1 left join (t2 as t, v1) on v1.a=t1.a; select * from t1 left join (t2 as t, t2) on t2.a=t1.a; drop view v1; drop table t1; + +# +# Collation with view update +# +create table t1 (s1 char); +create view v1 as select s1 collate latin1_german1_ci as s1 from t1; +insert into v1 values ('a'); +select * from v1; +update v1 set s1='b'; +select * from v1; +update v1,t1 set v1.s1='c' where t1.s1=v1.s1; +select * from v1; +drop view v1; +drop table t1; diff --git a/sql/item.h b/sql/item.h index 8608f2916a9..8094a2a10d7 100644 --- a/sql/item.h +++ b/sql/item.h @@ -22,6 +22,7 @@ class Protocol; struct st_table_list; void item_init(void); /* Init item functions */ +class Item_field; /* @@ -277,6 +278,7 @@ public: virtual void bring_value() {} Field *tmp_table_field_from_field_type(TABLE *table); + virtual Item_field *filed_for_view_update() { return 0; } virtual Item *neg_transformer(THD *thd) { return NULL; } void delete_self() @@ -497,6 +499,7 @@ public: Item *get_tmp_table_item(THD *thd); void cleanup(); inline uint32 max_disp_length() { return field->max_length(); } + Item_field *filed_for_view_update() { return this; } friend class Item_default_value; friend class Item_insert_value; friend class st_select_lex_unit; diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index df8861b2ee0..c4881a465a2 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -636,6 +636,11 @@ public: bool eq(const Item *item, bool binary_cmp) const; const char *func_name() const { return "collate"; } void print(String *str); + Item_field *filed_for_view_update() + { + /* this function is transparent for view updating */ + return args[0]->filed_for_view_update(); + } }; class Item_func_charset :public Item_str_func diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 5828f0be2f9..d7f254502c0 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -490,13 +490,13 @@ static bool check_view_insertability(TABLE_LIST *view, ulong query_id) { Item_field *field; /* simple SELECT list entry (field without expression) */ - if ((*trans)->type() != Item::FIELD_ITEM) + if (!(field= (*trans)->filed_for_view_update())) DBUG_RETURN(TRUE); - field= (Item_field *)(*trans); if (field->field->unireg_check == Field::NEXT_NUMBER) view->contain_auto_increment= 1; /* prepare unique test */ field->field->query_id= other_query_id; + *trans= field; // remove collation if we have it } /* unique test */ for (trans= trans_start; trans != trans_end; trans++) diff --git a/sql/sql_update.cc b/sql/sql_update.cc index dc867968262..7a9b0af242e 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -67,9 +67,10 @@ static bool check_fields(THD *thd, List<Item> &items) { List_iterator<Item> it(items); Item *item; + Item_field *field; while ((item= it++)) { - if (item->type() != Item::FIELD_ITEM) + if (!(field= item->filed_for_view_update())) { /* as far as item comes from VIEW select list it has name */ my_error(ER_NONUPDATEABLE_COLUMN, MYF(0), item->name); @@ -79,7 +80,7 @@ static bool check_fields(THD *thd, List<Item> &items) we make temporary copy of Item_field, to avoid influence of changing result_field on Item_ref which refer on this field */ - Item_field *field= new Item_field(thd, (Item_field *)item); + field= new Item_field(thd, field); it.replace(field); ((Item_field *)item)->register_item_tree_changing(it.ref()); } diff --git a/sql/sql_view.cc b/sql/sql_view.cc index 2364be228f8..178c01687b0 100644 --- a/sql/sql_view.cc +++ b/sql/sql_view.cc @@ -148,8 +148,9 @@ int mysql_create_view(THD *thd, Item *item; while ((item= it++)) { - if (item->type() == Item::FIELD_ITEM) - ((Item_field *)item)->any_privileges= 1; + Item_field *field; + if ((field= item->filed_for_view_update())) + field->any_privileges= 1; } } #endif @@ -237,17 +238,16 @@ int mysql_create_view(THD *thd, view->real_name); while ((item= it++)) { + Item_field *fld; uint priv= (get_column_grant(thd, &view->grant, db, view->real_name, item->name) & VIEW_ANY_ACL); - if (item->type() == Item::FIELD_ITEM) + if ((fld= item->filed_for_view_update())) { - Item_field *fld= (Item_field *)item; /* - There are no any privileges on VIEW column or there are - some other privileges then we have for underlaying table + Do we have more privilegeson view field then underlying table field */ - if (priv == 0 || (~fld->have_privileges & priv)) + if ((~fld->have_privileges & priv)) { /* VIEW column has more privileges */ my_printf_error(ER_COLUMNACCESS_DENIED_ERROR, @@ -261,22 +261,6 @@ int mysql_create_view(THD *thd, DBUG_RETURN(-1); } } - else - { - if (!(priv & SELECT_ACL)) - { - /* user have not privilege to SELECT expression */ - my_printf_error(ER_COLUMNACCESS_DENIED_ERROR, - ER(ER_COLUMNACCESS_DENIED_ERROR), - MYF(0), - "select", - thd->priv_user, - thd->host_or_ip, - item->name, - view->real_name); - DBUG_RETURN(-1); - } - } } } #endif @@ -903,8 +887,9 @@ bool check_key_in_view(THD *thd, TABLE_LIST *view) uint k; for (k= 0; k < elements_in_view; k++) { - if (trans[k]->type() == Item::FIELD_ITEM && - ((Item_field *)trans[k])->field == key_part->field) + Item_field *field; + if ((field= trans[k]->filed_for_view_update()) && + field->field == key_part->field) break; } if (k == elements_in_view) @@ -923,8 +908,9 @@ bool check_key_in_view(THD *thd, TABLE_LIST *view) { for (i= 0; i < elements_in_view; i++) { - if (trans[i]->type() == Item::FIELD_ITEM && - ((Item_field *)trans[i])->field == *field_ptr) + Item_field *field; + if ((field= trans[i]->filed_for_view_update()) && + field->field == *field_ptr) break; } if (i == elements_in_view) // If field didn't exists @@ -976,8 +962,9 @@ void insert_view_fields(List<Item> *list, TABLE_LIST *view) for (uint i= 0; i < elements_in_view; i++) { - if (trans[i]->type() == Item::FIELD_ITEM) - list->push_back(trans[i]); + Item_field *fld; + if ((fld= trans[i]->filed_for_view_update())) + list->push_back(fld); } DBUG_VOID_RETURN; } |