1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00
sql/sql_lex.cc:
  Auto merged
sql/sql_parse.cc:
  Auto merged
sql/sql_update.cc:
  Auto merged
sql/sql_yacc.yy:
  Auto merged
sql/table.cc:
  Auto merged
sql/table.h:
  Auto merged
This commit is contained in:
unknown
2004-10-07 11:36:46 +03:00
13 changed files with 150 additions and 109 deletions

View File

@ -80,6 +80,18 @@ int mysql_create_view(THD *thd,
}
#ifndef NO_EMBEDDED_ACCESS_CHECKS
/*
Privilege check for view creation:
- user have CREATE VIEW privilege on view table
- have some (SELECT/UPDATE/INSERT/DELETE) privileges on columns of
underlying tables used on top of SELECT list (because it can be
(theoretically) updated, so it is enough to have UPDATE privilege on
them, for example)
- have SELECT privilege on columns used in expressions of VIEW select
- for columns of underly tables used on top of SELECT list also will be
checked that we have not more privileges on correspondent column of view
table (i.e. user will not get some privileges by view creation)
*/
if (check_access(thd, CREATE_VIEW_ACL, view->db, &view->grant.privilege,
0, 0) ||
grant_option && check_grant(thd, CREATE_VIEW_ACL, view, 0, 1, 0))
@ -89,7 +101,7 @@ int mysql_create_view(THD *thd,
for (tbl= sl->get_table_list(); tbl; tbl= tbl->next_local)
{
/*
Ensure that we have some privilage on this table, more strict check
Ensure that we have some privileges on this table, more strict check
will be done on column level after preparation,
*/
if (check_some_access(thd, VIEW_ANY_ACL, tbl))
@ -103,16 +115,20 @@ int mysql_create_view(THD *thd,
tbl->real_name);
DBUG_RETURN(-1);
}
/* mark this table as table which will be checked after preparation */
/*
Mark this table as a table which will be checked after the prepare
phase
*/
tbl->table_in_first_from_clause= 1;
/*
We need to check only SELECT_ACL for all normal fields, fields
where we need any privilege will be marked later
We need to check only SELECT_ACL for all normal fields, fields for
which we need "any" (SELECT/UPDATE/INSERT/DELETE) privilege will be
checked later
*/
tbl->grant.want_privilege= SELECT_ACL;
/*
Make sure that all rights are loaded to table 'grant' field.
Make sure that all rights are loaded to the TABLE::grant field.
tbl->real_name will be correct name of table because VIEWs are
not opened yet.
@ -140,7 +156,7 @@ int mysql_create_view(THD *thd,
}
}
/*
Mark fields for special privilege check (any privilege)
Mark fields for special privilege check ("any" privilege)
*/
for (sl= select_lex; sl; sl= sl->next_select())
{
@ -169,14 +185,14 @@ int mysql_create_view(THD *thd,
}
/*
Copy privileges of underlaying VIEWs which was filled by
Copy the privileges of the underlying VIEWs which were filled by
fill_effective_table_privileges
(they was not copied in derived tables processing)
(they were not copied at derived tables processing)
*/
tbl->table->grant.privilege= tbl->grant.privilege;
}
// prepare select to resolve all fields
/* prepare select to resolve all fields */
lex->view_prepare_mode= 1;
if (unit->prepare(thd, 0, 0))
{
@ -227,7 +243,7 @@ int mysql_create_view(THD *thd,
#ifndef NO_EMBEDDED_ACCESS_CHECKS
/*
Compare/check grants on view with grants of underlaying tables
Compare/check grants on view with grants of underlying tables
*/
for (sl= select_lex; sl; sl= sl->next_select())
{
@ -245,7 +261,7 @@ int mysql_create_view(THD *thd,
if ((fld= item->filed_for_view_update()))
{
/*
Do we have more privilegeson view field then underlying table field
Do we have more privileges on view field then underlying table field?
*/
if ((~fld->have_privileges & priv))
{
@ -354,7 +370,7 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
LEX_STRING dir, file;
DBUG_ENTER("mysql_register_view");
// print query
/* print query */
str.length(0);
{
ulong sql_mode= thd->variables.sql_mode & MODE_ANSI_QUOTES;
@ -365,7 +381,7 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
str.append('\0');
DBUG_PRINT("VIEW", ("View: %s", str.ptr()));
// print file name
/* print file name */
(void) my_snprintf(dir_buff, FN_REFLEN, "%s/%s/",
mysql_data_home, view->db);
unpack_filename(dir_buff, dir_buff);
@ -379,7 +395,7 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
if (!view->timestamp.str)
view->timestamp.str= view->timestamp_buffer;
// check old .frm
/* check old .frm */
{
char path_buff[FN_REFLEN];
LEX_STRING path;
@ -411,7 +427,7 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
/*
read revision number
TODO: read dependense list, too, to process cascade/restrict
TODO: read dependence list, too, to process cascade/restrict
TODO: special cascade/restrict procedure for alter?
*/
if (parser->parse((gptr)view, &thd->mem_root,
@ -429,7 +445,7 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
}
}
}
// fill structure
/* fill structure */
view->query.str= (char*)str.ptr();
view->query.length= str.length()-1; // we do not need last \0
view->source.str= thd->query;
@ -451,7 +467,7 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
if ((view->updatable_view= (can_be_merged &&
view->algorithm != VIEW_ALGORITHM_TMPTABLE)))
{
// TODO: change here when we will support UNIONs
/* TODO: change here when we will support UNIONs */
for (TABLE_LIST *tbl= (TABLE_LIST *)thd->lex->select_lex.table_list.first;
tbl;
tbl= tbl->next_local)
@ -500,7 +516,6 @@ loop_out:
RETURN
0 ok
1 error
*/
my_bool
@ -644,7 +659,7 @@ mysql_make_view(File_parser *parser, TABLE_LIST *table)
/*
check rights to run commands (EXPLAIN SELECT & SHOW CREATE) which show
underlaying tables
underlying tables
*/
if ((old_lex->sql_command == SQLCOM_SELECT && old_lex->describe))
{
@ -694,7 +709,7 @@ mysql_make_view(File_parser *parser, TABLE_LIST *table)
/*
check MERGE algorithm ability
- algorithm is not explicit TEMPORARY TABLE
- VIEW SELECT allow marging
- VIEW SELECT allow merging
- VIEW used in subquery or command support MERGE algorithm
*/
if (table->algorithm != VIEW_ALGORITHM_TMPTABLE &&
@ -712,9 +727,7 @@ mysql_make_view(File_parser *parser, TABLE_LIST *table)
table->ancestor= view_tables;
/*
next table should include SELECT_LEX under this table SELECT_LEX
*/
/* next table should include SELECT_LEX under this table SELECT_LEX */
table->ancestor->select_lex= table->select_lex;
/*
@ -753,7 +766,7 @@ mysql_make_view(File_parser *parser, TABLE_LIST *table)
}
}
/* Store WHERE clause for postprocessing in setup_ancestor */
/* Store WHERE clause for post-processing in setup_ancestor */
table->where= view_select->where;
/*
@ -905,6 +918,13 @@ frm_type_enum mysql_frm_type(char *path)
thd thread handler
view view for check with opened table
DESCRIPTION
check that undertlaying table of viey contain one of following:
1) primary key of underlying table
2) unique key underlying table with fields for which NULL value is
impossible
3) all fields of underlying table
RETURN
FALSE OK
TRUE view do not contain key or all fields
@ -976,7 +996,7 @@ bool check_key_in_view(THD *thd, TABLE_LIST *view)
0 == NO ; Don't give any errors
1 == YES ; Give always an error
2 == LIMIT1 ; Give an error if this is used with LIMIT 1
This is used to protect against gui programs that
This is used to protect against GUI programs that
uses LIMIT 1 to update just the current row. This
doesn't work reliable if the view doesn't have a
unique key or if the view doesn't use all fields in