summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <dlenev@mysql.com>2004-09-18 01:34:38 +0400
committerunknown <dlenev@mysql.com>2004-09-18 01:34:38 +0400
commitdbee90a7b72521456358fd4e8fe85ea7bb326f5e (patch)
treebf861c714e2542255c5d6998b4d0f6903f559065
parent210829a18331cbbb66c444d300a7b86d10da58f1 (diff)
parent5c4226718173979968da14a23e73c4729d376a24 (diff)
downloadmariadb-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.result27
-rw-r--r--mysql-test/t/view.test34
-rw-r--r--sql/item.h3
-rw-r--r--sql/item_strfunc.h5
-rw-r--r--sql/sql_insert.cc4
-rw-r--r--sql/sql_update.cc5
-rw-r--r--sql/sql_view.cc45
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;
}