mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Merge sanja.is.com.ua:/home/bell/mysql/bk/work-bug5-5.0
into sanja.is.com.ua:/home/bell/mysql/bk/work-bug4-5.0
This commit is contained in:
@ -1831,3 +1831,56 @@ select * from v1;
|
|||||||
t
|
t
|
||||||
01:00
|
01:00
|
||||||
drop view v1;
|
drop view v1;
|
||||||
|
CREATE TABLE t1 (col1 time);
|
||||||
|
CREATE TABLE t2 (col1 time);
|
||||||
|
CREATE VIEW v1 AS SELECT CONVERT_TZ(col1,'GMT','MET') FROM t1;
|
||||||
|
CREATE VIEW v2 AS SELECT CONVERT_TZ(col1,'GMT','MET') FROM t2;
|
||||||
|
CREATE VIEW v3 AS SELECT CONVERT_TZ(col1,'GMT','MET') FROM t1;
|
||||||
|
CREATE VIEW v4 AS SELECT CONVERT_TZ(col1,'GMT','MET') FROM t2;
|
||||||
|
CREATE VIEW v5 AS SELECT CONVERT_TZ(col1,'GMT','MET') FROM t1;
|
||||||
|
CREATE VIEW v6 AS SELECT CONVERT_TZ(col1,'GMT','MET') FROM t2;
|
||||||
|
DROP TABLE t1;
|
||||||
|
CHECK TABLE v1, v2, v3, v4, v5, v6;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.v1 check error View 'test.v1' references invalid table(s) or column(s) or function(s)
|
||||||
|
test.v2 check status OK
|
||||||
|
test.v3 check error View 'test.v3' references invalid table(s) or column(s) or function(s)
|
||||||
|
test.v4 check status OK
|
||||||
|
test.v5 check error View 'test.v5' references invalid table(s) or column(s) or function(s)
|
||||||
|
test.v6 check status OK
|
||||||
|
drop view v1, v2, v3, v4, v5, v6;
|
||||||
|
drop table t2;
|
||||||
|
CREATE TABLE t1 (col1 time);
|
||||||
|
CREATE TABLE t2 (col1 time);
|
||||||
|
CREATE TABLE t3 (col1 time);
|
||||||
|
create function f1 () returns int return (select max(col1) from t1);
|
||||||
|
create function f2 () returns int return (select max(col1) from t2);
|
||||||
|
CREATE VIEW v1 AS SELECT f1() FROM t3;
|
||||||
|
CREATE VIEW v2 AS SELECT f2() FROM t3;
|
||||||
|
CREATE VIEW v3 AS SELECT f1() FROM t3;
|
||||||
|
CREATE VIEW v4 AS SELECT f2() FROM t3;
|
||||||
|
CREATE VIEW v5 AS SELECT f1() FROM t3;
|
||||||
|
CREATE VIEW v6 AS SELECT f2() FROM t3;
|
||||||
|
drop function f1;
|
||||||
|
CHECK TABLE v1, v2, v3, v4, v5, v6;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.v1 check error View 'test.v1' references invalid table(s) or column(s) or function(s)
|
||||||
|
test.v2 check status OK
|
||||||
|
test.v3 check error View 'test.v3' references invalid table(s) or column(s) or function(s)
|
||||||
|
test.v4 check status OK
|
||||||
|
test.v5 check error View 'test.v5' references invalid table(s) or column(s) or function(s)
|
||||||
|
test.v6 check status OK
|
||||||
|
create function f1 () returns int return (select max(col1) from t1);
|
||||||
|
DROP TABLE t1;
|
||||||
|
CHECK TABLE v1, v2, v3, v4, v5, v6;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.v1 check error Table 'test.t1' doesn't exist
|
||||||
|
test.v2 check status OK
|
||||||
|
test.v3 check error Table 'test.t1' doesn't exist
|
||||||
|
test.v4 check status OK
|
||||||
|
test.v5 check error Table 'test.t1' doesn't exist
|
||||||
|
test.v6 check status OK
|
||||||
|
drop function f1;
|
||||||
|
drop function f2;
|
||||||
|
drop view v1, v2, v3, v4, v5, v6;
|
||||||
|
drop table t2,t3;
|
||||||
|
@ -1673,3 +1673,41 @@ create view v1(k, K) as select 1,2;
|
|||||||
create view v1 as SELECT TIME_FORMAT(SEC_TO_TIME(3600),'%H:%i') as t;
|
create view v1 as SELECT TIME_FORMAT(SEC_TO_TIME(3600),'%H:%i') as t;
|
||||||
select * from v1;
|
select * from v1;
|
||||||
drop view v1;
|
drop view v1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# checking views after some view with error (BUG#11337)
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (col1 time);
|
||||||
|
CREATE TABLE t2 (col1 time);
|
||||||
|
CREATE VIEW v1 AS SELECT CONVERT_TZ(col1,'GMT','MET') FROM t1;
|
||||||
|
CREATE VIEW v2 AS SELECT CONVERT_TZ(col1,'GMT','MET') FROM t2;
|
||||||
|
CREATE VIEW v3 AS SELECT CONVERT_TZ(col1,'GMT','MET') FROM t1;
|
||||||
|
CREATE VIEW v4 AS SELECT CONVERT_TZ(col1,'GMT','MET') FROM t2;
|
||||||
|
CREATE VIEW v5 AS SELECT CONVERT_TZ(col1,'GMT','MET') FROM t1;
|
||||||
|
CREATE VIEW v6 AS SELECT CONVERT_TZ(col1,'GMT','MET') FROM t2;
|
||||||
|
DROP TABLE t1;
|
||||||
|
CHECK TABLE v1, v2, v3, v4, v5, v6;
|
||||||
|
drop view v1, v2, v3, v4, v5, v6;
|
||||||
|
drop table t2;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (col1 time);
|
||||||
|
CREATE TABLE t2 (col1 time);
|
||||||
|
CREATE TABLE t3 (col1 time);
|
||||||
|
create function f1 () returns int return (select max(col1) from t1);
|
||||||
|
create function f2 () returns int return (select max(col1) from t2);
|
||||||
|
CREATE VIEW v1 AS SELECT f1() FROM t3;
|
||||||
|
CREATE VIEW v2 AS SELECT f2() FROM t3;
|
||||||
|
CREATE VIEW v3 AS SELECT f1() FROM t3;
|
||||||
|
CREATE VIEW v4 AS SELECT f2() FROM t3;
|
||||||
|
CREATE VIEW v5 AS SELECT f1() FROM t3;
|
||||||
|
CREATE VIEW v6 AS SELECT f2() FROM t3;
|
||||||
|
drop function f1;
|
||||||
|
CHECK TABLE v1, v2, v3, v4, v5, v6;
|
||||||
|
create function f1 () returns int return (select max(col1) from t1);
|
||||||
|
DROP TABLE t1;
|
||||||
|
# following will show underlying table until BUG#11555 fix
|
||||||
|
CHECK TABLE v1, v2, v3, v4, v5, v6;
|
||||||
|
drop function f1;
|
||||||
|
drop function f2;
|
||||||
|
drop view v1, v2, v3, v4, v5, v6;
|
||||||
|
drop table t2,t3;
|
||||||
|
@ -1916,6 +1916,45 @@ void st_lex::link_first_table_back(TABLE_LIST *first,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
cleanup lex for case when we open table by table for processing
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
st_lex::cleanup_after_one_table_open()
|
||||||
|
*/
|
||||||
|
|
||||||
|
void st_lex::cleanup_after_one_table_open()
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
thd->lex->derived_tables & additional units may be set if we open
|
||||||
|
a view. It is necessary to clear thd->lex->derived_tables flag
|
||||||
|
to prevent processing of derived tables during next open_and_lock_tables
|
||||||
|
if next table is a real table and cleanup & remove underlying units
|
||||||
|
NOTE: all units will be connected to thd->lex->select_lex, because we
|
||||||
|
have not UNION on most upper level.
|
||||||
|
*/
|
||||||
|
if (all_selects_list != &select_lex)
|
||||||
|
{
|
||||||
|
derived_tables= 0;
|
||||||
|
/* cleunup underlying units (units of VIEW) */
|
||||||
|
for (SELECT_LEX_UNIT *un= select_lex.first_inner_unit();
|
||||||
|
un;
|
||||||
|
un= un->next_unit())
|
||||||
|
un->cleanup();
|
||||||
|
/* reduce all selects list to default state */
|
||||||
|
all_selects_list= &select_lex;
|
||||||
|
/* remove underlying units (units of VIEW) subtree */
|
||||||
|
select_lex.cut_subtree();
|
||||||
|
}
|
||||||
|
time_zone_tables_used= 0;
|
||||||
|
if (spfuns.records)
|
||||||
|
my_hash_reset(&spfuns);
|
||||||
|
if (spprocs.records)
|
||||||
|
my_hash_reset(&spprocs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
fix some structures at the end of preparation
|
fix some structures at the end of preparation
|
||||||
|
|
||||||
|
@ -371,7 +371,6 @@ typedef class st_select_lex_node SELECT_LEX_NODE;
|
|||||||
SELECT_LEX_UNIT - unit of selects (UNION, INTERSECT, ...) group
|
SELECT_LEX_UNIT - unit of selects (UNION, INTERSECT, ...) group
|
||||||
SELECT_LEXs
|
SELECT_LEXs
|
||||||
*/
|
*/
|
||||||
struct st_lex;
|
|
||||||
class THD;
|
class THD;
|
||||||
class select_result;
|
class select_result;
|
||||||
class JOIN;
|
class JOIN;
|
||||||
@ -627,7 +626,13 @@ public:
|
|||||||
order_list.first= 0;
|
order_list.first= 0;
|
||||||
order_list.next= (byte**) &order_list.first;
|
order_list.next= (byte**) &order_list.first;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
This method created for reiniting LEX in mysql_admin_table() and can be
|
||||||
|
used only if you are going remove all SELECT_LEX & units except belonger
|
||||||
|
to LEX (LEX::unit & LEX::select, for other purposes there are
|
||||||
|
SELECT_LEX_UNIT::exclude_level & SELECT_LEX_UNIT::exclude_tree
|
||||||
|
*/
|
||||||
|
void cut_subtree() { slave= 0; }
|
||||||
bool test_limit();
|
bool test_limit();
|
||||||
|
|
||||||
friend void lex_start(THD *thd, uchar *buf, uint length);
|
friend void lex_start(THD *thd, uchar *buf, uint length);
|
||||||
@ -912,7 +917,7 @@ typedef struct st_lex
|
|||||||
{
|
{
|
||||||
return ( query_tables_own_last ? *query_tables_own_last : 0);
|
return ( query_tables_own_last ? *query_tables_own_last : 0);
|
||||||
}
|
}
|
||||||
|
void cleanup_after_one_table_open();
|
||||||
} LEX;
|
} LEX;
|
||||||
|
|
||||||
struct st_lex_local: public st_lex
|
struct st_lex_local: public st_lex
|
||||||
|
@ -2103,6 +2103,7 @@ end:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
RETURN VALUES
|
RETURN VALUES
|
||||||
FALSE Message sent to net (admin operation went ok)
|
FALSE Message sent to net (admin operation went ok)
|
||||||
@ -2122,10 +2123,12 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
|||||||
HA_CHECK_OPT *),
|
HA_CHECK_OPT *),
|
||||||
int (view_operator_func)(THD *, TABLE_LIST*))
|
int (view_operator_func)(THD *, TABLE_LIST*))
|
||||||
{
|
{
|
||||||
TABLE_LIST *table, *next_global_table;
|
TABLE_LIST *table, *save_next_global, *save_next_local;
|
||||||
|
SELECT_LEX *select= &thd->lex->select_lex;
|
||||||
List<Item> field_list;
|
List<Item> field_list;
|
||||||
Item *item;
|
Item *item;
|
||||||
Protocol *protocol= thd->protocol;
|
Protocol *protocol= thd->protocol;
|
||||||
|
LEX *lex= thd->lex;
|
||||||
int result_code;
|
int result_code;
|
||||||
DBUG_ENTER("mysql_admin_table");
|
DBUG_ENTER("mysql_admin_table");
|
||||||
|
|
||||||
@ -2152,12 +2155,25 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
|||||||
thd->open_options|= extra_open_options;
|
thd->open_options|= extra_open_options;
|
||||||
table->lock_type= lock_type;
|
table->lock_type= lock_type;
|
||||||
/* open only one table from local list of command */
|
/* open only one table from local list of command */
|
||||||
next_global_table= table->next_global;
|
save_next_global= table->next_global;
|
||||||
table->next_global= 0;
|
table->next_global= 0;
|
||||||
|
save_next_local= table->next_local;
|
||||||
|
table->next_local= 0;
|
||||||
|
select->table_list.first= (byte*)table;
|
||||||
|
/*
|
||||||
|
Time zone tables and SP tables can be add to lex->query_tables list,
|
||||||
|
so it have to be prepared.
|
||||||
|
TODO: Investigate if we can put extra tables into argument instead of
|
||||||
|
using lex->query_tables
|
||||||
|
*/
|
||||||
|
lex->query_tables= table;
|
||||||
|
lex->query_tables_last= &table->next_global;
|
||||||
|
lex->query_tables_own_last= 0;;
|
||||||
thd->no_warnings_for_error= no_warnings_for_error;
|
thd->no_warnings_for_error= no_warnings_for_error;
|
||||||
open_and_lock_tables(thd, table);
|
open_and_lock_tables(thd, table);
|
||||||
thd->no_warnings_for_error= 0;
|
thd->no_warnings_for_error= 0;
|
||||||
table->next_global= next_global_table;
|
table->next_global= save_next_global;
|
||||||
|
table->next_local= save_next_local;
|
||||||
/* if view are unsupported */
|
/* if view are unsupported */
|
||||||
if (table->view && view_operator_func == NULL)
|
if (table->view && view_operator_func == NULL)
|
||||||
{
|
{
|
||||||
@ -2205,7 +2221,13 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
|||||||
err_msg= (const char *)buf;
|
err_msg= (const char *)buf;
|
||||||
}
|
}
|
||||||
protocol->store(err_msg, system_charset_info);
|
protocol->store(err_msg, system_charset_info);
|
||||||
|
lex->cleanup_after_one_table_open();
|
||||||
thd->clear_error();
|
thd->clear_error();
|
||||||
|
/*
|
||||||
|
View opening can be interrupted in the middle of process so some
|
||||||
|
tables can be left opening
|
||||||
|
*/
|
||||||
|
close_thread_tables(thd);
|
||||||
if (protocol->write())
|
if (protocol->write())
|
||||||
goto err;
|
goto err;
|
||||||
continue;
|
continue;
|
||||||
@ -2274,6 +2296,7 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
|||||||
|
|
||||||
send_result:
|
send_result:
|
||||||
|
|
||||||
|
lex->cleanup_after_one_table_open();
|
||||||
thd->clear_error(); // these errors shouldn't get client
|
thd->clear_error(); // these errors shouldn't get client
|
||||||
protocol->prepare_for_resend();
|
protocol->prepare_for_resend();
|
||||||
protocol->store(table_name, system_charset_info);
|
protocol->store(table_name, system_charset_info);
|
||||||
@ -2401,13 +2424,6 @@ send_result_message:
|
|||||||
}
|
}
|
||||||
close_thread_tables(thd);
|
close_thread_tables(thd);
|
||||||
table->table=0; // For query cache
|
table->table=0; // For query cache
|
||||||
/*
|
|
||||||
thd->lex->derived_tables may be set to non zero value if we open
|
|
||||||
a view. It is necessary to clear thd->lex->derived_tables flag
|
|
||||||
to prevent processing of derived tables during next open_and_lock_tables
|
|
||||||
if next table is a real table.
|
|
||||||
*/
|
|
||||||
thd->lex->derived_tables= 0;
|
|
||||||
if (protocol->write())
|
if (protocol->write())
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user