summaryrefslogtreecommitdiff
path: root/sql/sql_view.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sql_view.cc')
-rw-r--r--sql/sql_view.cc45
1 files changed, 16 insertions, 29 deletions
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;
}