Commit 56fa40e5 authored by serg@serg.mylan's avatar serg@serg.mylan

sql_yacc.yy:

  missing semicolon added
sql_base.cc:
  bad merge fixed
sp_head.cc, view.test, view.result:
  Correct restoring view name in SP table locking BUG#9758
configure.in:
  restore -fno-implicit-templates -fno-exceptions -fno-rtti in configure
parent 8355b39d
...@@ -359,6 +359,14 @@ AC_SUBST(INSTALL_SCRIPT) ...@@ -359,6 +359,14 @@ AC_SUBST(INSTALL_SCRIPT)
export CC CXX CFLAGS LD LDFLAGS AR export CC CXX CFLAGS LD LDFLAGS AR
if test "$GCC" = "yes"
then
# mysqld requires -fno-implicit-templates.
# Disable exceptions as they seams to create problems with gcc and threads.
# mysqld doesn't use run-time-type-checking, so we disable it.
CXXFLAGS="$CXXFLAGS -fno-implicit-templates -fno-exceptions -fno-rtti"
fi
# Avoid bug in fcntl on some versions of linux # Avoid bug in fcntl on some versions of linux
AC_MSG_CHECKING("if we should use 'skip-locking' as default for $target_os") AC_MSG_CHECKING("if we should use 'skip-locking' as default for $target_os")
# Any variation of Linux # Any variation of Linux
......
...@@ -1712,3 +1712,17 @@ a b ...@@ -1712,3 +1712,17 @@ a b
2 2 2 2
4 4 4 4
DROP VIEW v2,v1; DROP VIEW v2,v1;
DROP TABLE t1, t2;
create table t1 (a int);
create view v1 as select sum(a) from t1 group by a;
create procedure p1()
begin
select * from v1;
end//
call p1();
sum(a)
call p1();
sum(a)
drop procedure p1;
drop view v1;
drop table t1;
...@@ -1521,8 +1521,10 @@ SELECT a.col1,a.col2,b.col2,b.col3 ...@@ -1521,8 +1521,10 @@ SELECT a.col1,a.col2,b.col2,b.col3
DROP VIEW v1,v2,v3; DROP VIEW v1,v2,v3;
DROP TABLE t1,t2; DROP TABLE t1,t2;
#
# BUG#8490 Select from views containing subqueries causes server to hang # BUG#8490 Select from views containing subqueries causes server to hang
# forever. # forever.
#
create table t1 as select 1 A union select 2 union select 3; create table t1 as select 1 A union select 2 union select 3;
create table t2 as select * from t1; create table t2 as select * from t1;
create view v1 as select * from t1 where a in (select * from t2); create view v1 as select * from t1 where a in (select * from t2);
...@@ -1537,7 +1539,6 @@ drop table t1, t2, t3; ...@@ -1537,7 +1539,6 @@ drop table t1, t2, t3;
# #
# Test case for bug #8528: select from view over multi-table view # Test case for bug #8528: select from view over multi-table view
# #
CREATE TABLE t1 (a int); CREATE TABLE t1 (a int);
CREATE TABLE t2 (b int); CREATE TABLE t2 (b int);
INSERT INTO t1 VALUES (1), (2), (3), (4); INSERT INTO t1 VALUES (1), (2), (3), (4);
...@@ -1549,3 +1550,22 @@ CREATE VIEW v2 AS SELECT * FROM v1; ...@@ -1549,3 +1550,22 @@ CREATE VIEW v2 AS SELECT * FROM v1;
SELECT * FROM v2; SELECT * FROM v2;
DROP VIEW v2,v1; DROP VIEW v2,v1;
DROP TABLE t1, t2;
#
# Correct restoring view name in SP table locking BUG#9758
#
create table t1 (a int);
create view v1 as select sum(a) from t1 group by a;
delimiter //;
create procedure p1()
begin
select * from v1;
end//
delimiter ;//
call p1();
call p1();
drop procedure p1;
drop view v1;
drop table t1;
...@@ -2090,15 +2090,10 @@ sp_restore_security_context(THD *thd, sp_head *sp, st_sp_security_context *ctxp) ...@@ -2090,15 +2090,10 @@ sp_restore_security_context(THD *thd, sp_head *sp, st_sp_security_context *ctxp)
typedef struct st_sp_table typedef struct st_sp_table
{ {
LEX_STRING qname; LEX_STRING qname; /* Multi-set key: db_name\0table_name\0alias\0 */
bool temp; uint db_length, table_name_length;
TABLE_LIST *table; bool temp; /* true if corresponds to a temporary table */
/* thr_lock_type lock_type; /* lock type used for prelocking */
We can't use table->lock_type as lock type for table
in multi-set since it can be changed by statement during
its execution (e.g. as this happens for multi-update).
*/
thr_lock_type lock_type;
uint lock_count; uint lock_count;
uint query_lock_count; uint query_lock_count;
} SP_TABLE; } SP_TABLE;
...@@ -2150,15 +2145,15 @@ sp_head::merge_table_list(THD *thd, TABLE_LIST *table, LEX *lex_for_tmp_check) ...@@ -2150,15 +2145,15 @@ sp_head::merge_table_list(THD *thd, TABLE_LIST *table, LEX *lex_for_tmp_check)
for (; table ; table= table->next_global) for (; table ; table= table->next_global)
if (!table->derived && !table->schema_table) if (!table->derived && !table->schema_table)
{ {
char tname[64+1+64+1+64+1]; // db.table.alias\0 char tname[(NAME_LEN + 1) * 3]; // db\0table\0alias\0
uint tlen, alen; uint tlen, alen;
tlen= table->db_length; tlen= table->db_length;
memcpy(tname, table->db, tlen); memcpy(tname, table->db, tlen);
tname[tlen++]= '.'; tname[tlen++]= '\0';
memcpy(tname+tlen, table->table_name, table->table_name_length); memcpy(tname+tlen, table->table_name, table->table_name_length);
tlen+= table->table_name_length; tlen+= table->table_name_length;
tname[tlen++]= '.'; tname[tlen++]= '\0';
alen= strlen(table->alias); alen= strlen(table->alias);
memcpy(tname+tlen, table->alias, alen); memcpy(tname+tlen, table->alias, alen);
tlen+= alen; tlen+= alen;
...@@ -2181,14 +2176,15 @@ sp_head::merge_table_list(THD *thd, TABLE_LIST *table, LEX *lex_for_tmp_check) ...@@ -2181,14 +2176,15 @@ sp_head::merge_table_list(THD *thd, TABLE_LIST *table, LEX *lex_for_tmp_check)
if (!(tab= (SP_TABLE *)thd->calloc(sizeof(SP_TABLE)))) if (!(tab= (SP_TABLE *)thd->calloc(sizeof(SP_TABLE))))
return FALSE; return FALSE;
tab->qname.length= tlen; tab->qname.length= tlen;
tab->qname.str= (char *)thd->strmake(tname, tab->qname.length); tab->qname.str= (char*) thd->memdup(tname, tab->qname.length + 1);
if (!tab->qname.str) if (!tab->qname.str)
return FALSE; return FALSE;
if (lex_for_tmp_check->sql_command == SQLCOM_CREATE_TABLE && if (lex_for_tmp_check->sql_command == SQLCOM_CREATE_TABLE &&
lex_for_tmp_check->query_tables == table && lex_for_tmp_check->query_tables == table &&
lex_for_tmp_check->create_info.options & HA_LEX_CREATE_TMP_TABLE) lex_for_tmp_check->create_info.options & HA_LEX_CREATE_TMP_TABLE)
tab->temp= TRUE; tab->temp= TRUE;
tab->table= table; tab->table_name_length= table->table_name_length;
tab->db_length= table->db_length;
tab->lock_type= table->lock_type; tab->lock_type= table->lock_type;
tab->lock_count= tab->query_lock_count= 1; tab->lock_count= tab->query_lock_count= 1;
my_hash_insert(&m_sptabs, (byte *)tab); my_hash_insert(&m_sptabs, (byte *)tab);
...@@ -2236,13 +2232,11 @@ sp_head::add_used_tables_to_table_list(THD *thd, ...@@ -2236,13 +2232,11 @@ sp_head::add_used_tables_to_table_list(THD *thd,
for (i=0 ; i < m_sptabs.records ; i++) for (i=0 ; i < m_sptabs.records ; i++)
{ {
char *tab_buff; char *tab_buff;
TABLE_LIST *table, *otable; TABLE_LIST *table;
SP_TABLE *stab= (SP_TABLE *)hash_element(&m_sptabs, i); SP_TABLE *stab= (SP_TABLE *)hash_element(&m_sptabs, i);
if (stab->temp) if (stab->temp)
continue; continue;
otable= stab->table;
if (!(tab_buff= (char *)thd->calloc(ALIGN_SIZE(sizeof(TABLE_LIST)) * if (!(tab_buff= (char *)thd->calloc(ALIGN_SIZE(sizeof(TABLE_LIST)) *
stab->lock_count))) stab->lock_count)))
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
...@@ -2257,11 +2251,11 @@ sp_head::add_used_tables_to_table_list(THD *thd, ...@@ -2257,11 +2251,11 @@ sp_head::add_used_tables_to_table_list(THD *thd,
that the PS will be invalidated if the functions is deleted or that the PS will be invalidated if the functions is deleted or
changed. changed.
*/ */
table->db= otable->db; table->db= stab->qname.str;
table->db_length= otable->db_length; table->db_length= stab->db_length;
table->alias= otable->alias; table->table_name= table->db + table->db_length + 1;
table->table_name= otable->table_name; table->table_name_length= stab->table_name_length;
table->table_name_length= otable->table_name_length; table->alias= table->table_name + table->table_name_length + 1;
table->lock_type= stab->lock_type; table->lock_type= stab->lock_type;
table->cacheable_table= 1; table->cacheable_table= 1;
table->prelocking_placeholder= 1; table->prelocking_placeholder= 1;
......
...@@ -3307,7 +3307,7 @@ bool get_key_map_from_key_list(key_map *map, TABLE *table, ...@@ -3307,7 +3307,7 @@ bool get_key_map_from_key_list(key_map *map, TABLE *table,
0) 0)
{ {
my_error(ER_KEY_COLUMN_DOES_NOT_EXITS, MYF(0), name->c_ptr(), my_error(ER_KEY_COLUMN_DOES_NOT_EXITS, MYF(0), name->c_ptr(),
table->real_name); table->s->table_name);
map->set_all(); map->set_all();
return 1; return 1;
} }
......
...@@ -3994,6 +3994,7 @@ select_options: ...@@ -3994,6 +3994,7 @@ select_options:
YYABORT; YYABORT;
} }
} }
;
select_option_list: select_option_list:
select_option_list select_option select_option_list select_option
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment