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
...@@ -7454,8 +7455,8 @@ option_type_value: ...@@ -7454,8 +7455,8 @@ option_type_value:
/* /*
If we are in SP we want have own LEX for each assignment. If we are in SP we want have own LEX for each assignment.
This is mostly because it is hard for several sp_instr_set This is mostly because it is hard for several sp_instr_set
and sp_instr_set_trigger instructions share one LEX. and sp_instr_set_trigger instructions share one LEX.
(Well, it is theoretically possible but adds some extra (Well, it is theoretically possible but adds some extra
overhead on preparation for execution stage and IMO less overhead on preparation for execution stage and IMO less
robust). robust).
...@@ -7464,7 +7465,7 @@ option_type_value: ...@@ -7464,7 +7465,7 @@ option_type_value:
LEX *lex; LEX *lex;
Lex->sphead->reset_lex(YYTHD); Lex->sphead->reset_lex(YYTHD);
lex= Lex; lex= Lex;
/* Set new LEX as if we at start of set rule. */ /* Set new LEX as if we at start of set rule. */
lex->sql_command= SQLCOM_SET_OPTION; lex->sql_command= SQLCOM_SET_OPTION;
mysql_init_select(lex); mysql_init_select(lex);
...@@ -7477,11 +7478,11 @@ option_type_value: ...@@ -7477,11 +7478,11 @@ option_type_value:
option_type option_value option_type option_value
{ {
LEX *lex= Lex; LEX *lex= Lex;
if (lex->sphead) if (lex->sphead)
{ {
sp_head *sp= lex->sphead; sp_head *sp= lex->sphead;
if (!lex->var_list.is_empty()) if (!lex->var_list.is_empty())
{ {
/* /*
...@@ -7491,19 +7492,19 @@ option_type_value: ...@@ -7491,19 +7492,19 @@ option_type_value:
*/ */
LEX_STRING qbuff; LEX_STRING qbuff;
sp_instr_stmt *i; sp_instr_stmt *i;
if (!(i= new sp_instr_stmt(sp->instructions(), lex->spcont, if (!(i= new sp_instr_stmt(sp->instructions(), lex->spcont,
lex))) lex)))
YYABORT; YYABORT;
if (lex->ptr - lex->tok_end > 1) if (lex->ptr - lex->tok_end > 1)
qbuff.length= lex->ptr - sp->m_tmp_query; qbuff.length= lex->ptr - sp->m_tmp_query;
else else
qbuff.length= lex->tok_end - sp->m_tmp_query; qbuff.length= lex->tok_end - sp->m_tmp_query;
if (!(qbuff.str= alloc_root(YYTHD->mem_root, qbuff.length + 5))) if (!(qbuff.str= alloc_root(YYTHD->mem_root, qbuff.length + 5)))
YYABORT; YYABORT;
strmake(strmake(qbuff.str, "SET ", 4), (char *)sp->m_tmp_query, strmake(strmake(qbuff.str, "SET ", 4), (char *)sp->m_tmp_query,
qbuff.length); qbuff.length);
qbuff.length+= 4; qbuff.length+= 4;
......
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