diff options
author | unknown <serg@serg.mylan> | 2005-05-17 17:08:43 +0200 |
---|---|---|
committer | unknown <serg@serg.mylan> | 2005-05-17 17:08:43 +0200 |
commit | afaa3c8923288aaaa41f8f519bbc96f3b72b1d50 (patch) | |
tree | 8ea1ff1c24dbce69b716e8728988c74b6b86195f | |
parent | 3a9ddef2394bc141fa8593e35e4edeae473463d8 (diff) | |
download | mariadb-git-afaa3c8923288aaaa41f8f519bbc96f3b72b1d50.tar.gz |
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
configure.in:
restore -fno-implicit-templates -fno-exceptions -fno-rtti in configure
mysql-test/r/view.result:
Correct restoring view name in SP table locking BUG#9758
mysql-test/t/view.test:
Correct restoring view name in SP table locking BUG#9758
sql/sp_head.cc:
Correct restoring view name in SP table locking BUG#9758
sql/sql_base.cc:
bad merge fixed
sql/sql_yacc.yy:
missing semicolon added
-rw-r--r-- | configure.in | 8 | ||||
-rw-r--r-- | mysql-test/r/view.result | 14 | ||||
-rw-r--r-- | mysql-test/t/view.test | 22 | ||||
-rw-r--r-- | sql/sp_head.cc | 38 | ||||
-rw-r--r-- | sql/sql_base.cc | 2 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 19 |
6 files changed, 70 insertions, 33 deletions
diff --git a/configure.in b/configure.in index 3e116d608f7..980bb461924 100644 --- a/configure.in +++ b/configure.in @@ -359,6 +359,14 @@ AC_SUBST(INSTALL_SCRIPT) 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 AC_MSG_CHECKING("if we should use 'skip-locking' as default for $target_os") # Any variation of Linux diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index 4190b57418e..84be086ae37 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -1712,3 +1712,17 @@ a b 2 2 4 4 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; diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index 6f0cf59bb25..0477ab0ea20 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -1521,8 +1521,10 @@ SELECT a.col1,a.col2,b.col2,b.col3 DROP VIEW v1,v2,v3; DROP TABLE t1,t2; +# # BUG#8490 Select from views containing subqueries causes server to hang # forever. +# create table t1 as select 1 A union select 2 union select 3; create table t2 as select * from t1; create view v1 as select * from t1 where a in (select * from t2); @@ -1537,7 +1539,6 @@ drop table t1, t2, t3; # # Test case for bug #8528: select from view over multi-table view # - CREATE TABLE t1 (a int); CREATE TABLE t2 (b int); INSERT INTO t1 VALUES (1), (2), (3), (4); @@ -1549,3 +1550,22 @@ CREATE VIEW v2 AS SELECT * FROM v1; SELECT * FROM v2; 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; + diff --git a/sql/sp_head.cc b/sql/sp_head.cc index 2ffcd45b1a7..2f65a446ae8 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -2090,15 +2090,10 @@ sp_restore_security_context(THD *thd, sp_head *sp, st_sp_security_context *ctxp) typedef struct st_sp_table { - LEX_STRING qname; - bool temp; - TABLE_LIST *table; - /* - 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; + LEX_STRING qname; /* Multi-set key: db_name\0table_name\0alias\0 */ + uint db_length, table_name_length; + bool temp; /* true if corresponds to a temporary table */ + thr_lock_type lock_type; /* lock type used for prelocking */ uint lock_count; uint query_lock_count; } SP_TABLE; @@ -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) 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; tlen= table->db_length; memcpy(tname, table->db, tlen); - tname[tlen++]= '.'; + tname[tlen++]= '\0'; memcpy(tname+tlen, table->table_name, table->table_name_length); tlen+= table->table_name_length; - tname[tlen++]= '.'; + tname[tlen++]= '\0'; alen= strlen(table->alias); memcpy(tname+tlen, table->alias, alen); tlen+= alen; @@ -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)))) return FALSE; 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) return FALSE; if (lex_for_tmp_check->sql_command == SQLCOM_CREATE_TABLE && lex_for_tmp_check->query_tables == table && lex_for_tmp_check->create_info.options & HA_LEX_CREATE_TMP_TABLE) 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_count= tab->query_lock_count= 1; my_hash_insert(&m_sptabs, (byte *)tab); @@ -2236,13 +2232,11 @@ sp_head::add_used_tables_to_table_list(THD *thd, for (i=0 ; i < m_sptabs.records ; i++) { char *tab_buff; - TABLE_LIST *table, *otable; + TABLE_LIST *table; SP_TABLE *stab= (SP_TABLE *)hash_element(&m_sptabs, i); if (stab->temp) continue; - otable= stab->table; - if (!(tab_buff= (char *)thd->calloc(ALIGN_SIZE(sizeof(TABLE_LIST)) * stab->lock_count))) DBUG_RETURN(FALSE); @@ -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 changed. */ - table->db= otable->db; - table->db_length= otable->db_length; - table->alias= otable->alias; - table->table_name= otable->table_name; - table->table_name_length= otable->table_name_length; + table->db= stab->qname.str; + table->db_length= stab->db_length; + table->table_name= table->db + table->db_length + 1; + table->table_name_length= stab->table_name_length; + table->alias= table->table_name + table->table_name_length + 1; table->lock_type= stab->lock_type; table->cacheable_table= 1; table->prelocking_placeholder= 1; diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 4a8303695e9..29d9a7bf9c4 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -3307,7 +3307,7 @@ bool get_key_map_from_key_list(key_map *map, TABLE *table, 0) { my_error(ER_KEY_COLUMN_DOES_NOT_EXITS, MYF(0), name->c_ptr(), - table->real_name); + table->s->table_name); map->set_all(); return 1; } diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 9328d7345c3..d896b244a7e 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -3994,6 +3994,7 @@ select_options: YYABORT; } } + ; select_option_list: select_option_list select_option @@ -7454,8 +7455,8 @@ option_type_value: /* 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 - and sp_instr_set_trigger instructions share one LEX. - (Well, it is theoretically possible but adds some extra + and sp_instr_set_trigger instructions share one LEX. + (Well, it is theoretically possible but adds some extra overhead on preparation for execution stage and IMO less robust). @@ -7464,7 +7465,7 @@ option_type_value: LEX *lex; Lex->sphead->reset_lex(YYTHD); lex= Lex; - + /* Set new LEX as if we at start of set rule. */ lex->sql_command= SQLCOM_SET_OPTION; mysql_init_select(lex); @@ -7477,11 +7478,11 @@ option_type_value: option_type option_value { LEX *lex= Lex; - + if (lex->sphead) { sp_head *sp= lex->sphead; - + if (!lex->var_list.is_empty()) { /* @@ -7491,19 +7492,19 @@ option_type_value: */ LEX_STRING qbuff; sp_instr_stmt *i; - + if (!(i= new sp_instr_stmt(sp->instructions(), lex->spcont, lex))) YYABORT; - + if (lex->ptr - lex->tok_end > 1) qbuff.length= lex->ptr - sp->m_tmp_query; else qbuff.length= lex->tok_end - sp->m_tmp_query; - + if (!(qbuff.str= alloc_root(YYTHD->mem_root, qbuff.length + 5))) YYABORT; - + strmake(strmake(qbuff.str, "SET ", 4), (char *)sp->m_tmp_query, qbuff.length); qbuff.length+= 4; |