summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <serg@serg.mylan>2005-05-17 17:08:43 +0200
committerunknown <serg@serg.mylan>2005-05-17 17:08:43 +0200
commitafaa3c8923288aaaa41f8f519bbc96f3b72b1d50 (patch)
tree8ea1ff1c24dbce69b716e8728988c74b6b86195f
parent3a9ddef2394bc141fa8593e35e4edeae473463d8 (diff)
downloadmariadb-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.in8
-rw-r--r--mysql-test/r/view.result14
-rw-r--r--mysql-test/t/view.test22
-rw-r--r--sql/sp_head.cc38
-rw-r--r--sql/sql_base.cc2
-rw-r--r--sql/sql_yacc.yy19
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;