Below is the list of changes that have just been committed into a local
5.0 repository of bell. When bell does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet
1.2044 05/11/11 16:51:08 bell@stripped +5 -0
Issuing error about presence of autocommit statements in Stored functions and triggers added to SP parsing procedure (BUG#13627)
mysql-test/t/implicit_commit.test
1.1 05/11/11 16:51:04 bell@stripped +138 -0
New BitKeeper file ``mysql-test/t/implicit_commit.test''
mysql-test/t/implicit_commit.test
1.0 05/11/11 16:51:04 bell@stripped +0 -0
BitKeeper file /home/bell/mysql/bk/work-bug5-5.0/mysql-test/t/implicit_commit.test
mysql-test/r/implicit_commit.result
1.1 05/11/11 16:51:03 bell@stripped +103 -0
New BitKeeper file ``mysql-test/r/implicit_commit.result''
sql/sql_yacc.yy
1.435 05/11/11 16:51:03 bell@stripped +9 -56
Removed autocommit-statement-present errors spread by this file, only one check left which check flags of a SP
sql/sp_head.h
1.74 05/11/11 16:51:03 bell@stripped +4 -2
The new flag about autocommit presence added
A comment fixed
sql/sp_head.cc
1.192 05/11/11 16:51:03 bell@stripped +39 -0
We set the new flag about autocommit statements presence
mysql-test/r/implicit_commit.result
1.0 05/11/11 16:51:03 bell@stripped +0 -0
BitKeeper file /home/bell/mysql/bk/work-bug5-5.0/mysql-test/r/implicit_commit.result
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: bell
# Host: sanja.is.com.ua
# Root: /home/bell/mysql/bk/work-bug5-5.0
--- 1.434/sql/sql_yacc.yy 2005-10-13 17:27:29 +03:00
+++ 1.435/sql/sql_yacc.yy 2005-11-11 16:51:03 +02:00
@@ -1157,11 +1157,6 @@
| CREATE opt_unique_or_fulltext INDEX_SYM ident key_alg ON table_ident
{
LEX *lex=Lex;
- if (lex->sphead && lex->sphead->m_type != TYPE_ENUM_PROCEDURE)
- {
- my_error(ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG, MYF(0));
- YYABORT;
- }
lex->sql_command= SQLCOM_CREATE_INDEX;
if (!lex->current_select->add_table_to_list(lex->thd, $7, NULL,
TL_OPTION_UPDATING))
@@ -1305,7 +1300,6 @@
{
LEX *lex= Lex;
sp_head *sp= lex->sphead;
-
lex->sql_command= SQLCOM_CREATE_TRIGGER;
sp->init_strings(YYTHD, lex, $3);
/* Restore flag if it was cleared above */
@@ -1960,6 +1954,13 @@
my_error(ER_SP_BADSTATEMENT, MYF(0), "USE");
YYABORT;
}
+ if (sp->m_type != TYPE_ENUM_PROCEDURE &&
+ (sp->m_flags & sp_head::HAS_AUTOCOMMIT))
+ {
+ my_error(ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG, MYF(0));
+ YYABORT;
+ }
+
/*
Don't add an instruction for SET statements, since all
instructions for them were already added during processing
@@ -3348,11 +3349,6 @@
{
THD *thd= YYTHD;
LEX *lex= thd->lex;
- if (lex->sphead && lex->sphead->m_type != TYPE_ENUM_PROCEDURE)
- {
- my_error(ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG, MYF(0));
- YYABORT;
- }
lex->sql_command= SQLCOM_ALTER_TABLE;
lex->name= 0;
lex->duplicates= DUP_ERROR;
@@ -3661,11 +3657,6 @@
START_SYM TRANSACTION_SYM start_transaction_opts
{
LEX *lex= Lex;
- if (lex->sphead && lex->sphead->m_type != TYPE_ENUM_PROCEDURE)
- {
- my_error(ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG, MYF(0));
- YYABORT;
- }
lex->sql_command= SQLCOM_BEGIN;
lex->start_transaction_opt= $3;
}
@@ -3850,13 +3841,7 @@
rename:
RENAME table_or_tables
{
- LEX *lex= Lex;
- if (lex->sphead && lex->sphead->m_type != TYPE_ENUM_PROCEDURE)
- {
- my_error(ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG, MYF(0));
- YYABORT;
- }
- lex->sql_command=SQLCOM_RENAME_TABLE;
+ Lex->sql_command= SQLCOM_RENAME_TABLE;
}
table_to_table_list
{}
@@ -5987,21 +5972,10 @@
lex->sql_command = SQLCOM_DROP_TABLE;
lex->drop_temporary= $2;
lex->drop_if_exists= $4;
- if (!lex->drop_temporary && lex->sphead &&
- lex->sphead->m_type != TYPE_ENUM_PROCEDURE)
- {
- my_error(ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG, MYF(0));
- YYABORT;
- }
}
| DROP INDEX_SYM ident ON table_ident {}
{
LEX *lex=Lex;
- if (lex->sphead && lex->sphead->m_type != TYPE_ENUM_PROCEDURE)
- {
- my_error(ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG, MYF(0));
- YYABORT;
- }
lex->sql_command= SQLCOM_DROP_INDEX;
lex->alter_info.drop_list.empty();
lex->alter_info.drop_list.push_back(new Alter_drop(Alter_drop::KEY,
@@ -6047,13 +6021,7 @@
}
| DROP VIEW_SYM if_exists table_list opt_restrict
{
- THD *thd= YYTHD;
- LEX *lex= thd->lex;
- if (lex->sphead && lex->sphead->m_type != TYPE_ENUM_PROCEDURE)
- {
- my_error(ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG, MYF(0));
- YYABORT;
- }
+ LEX *lex= Lex;
lex->sql_command= SQLCOM_DROP_VIEW;
lex->drop_if_exists= $3;
}
@@ -8693,11 +8661,6 @@
BEGIN_SYM
{
LEX *lex=Lex;
- if (lex->sphead && lex->sphead->m_type != TYPE_ENUM_PROCEDURE)
- {
- my_error(ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG, MYF(0));
- YYABORT;
- }
lex->sql_command = SQLCOM_BEGIN;
lex->start_transaction_opt= 0;
}
@@ -8730,11 +8693,6 @@
COMMIT_SYM opt_work opt_chain opt_release
{
LEX *lex=Lex;
- if (lex->sphead && lex->sphead->m_type != TYPE_ENUM_PROCEDURE)
- {
- my_error(ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG, MYF(0));
- YYABORT;
- }
lex->sql_command= SQLCOM_COMMIT;
lex->tx_chain= $3;
lex->tx_release= $4;
@@ -8745,11 +8703,6 @@
ROLLBACK_SYM opt_work opt_chain opt_release
{
LEX *lex=Lex;
- if (lex->sphead && lex->sphead->m_type != TYPE_ENUM_PROCEDURE)
- {
- my_error(ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG, MYF(0));
- YYABORT;
- }
lex->sql_command= SQLCOM_ROLLBACK;
lex->tx_chain= $3;
lex->tx_release= $4;
--- New file ---
+++ mysql-test/r/implicit_commit.result 05/11/11 16:51:03
drop table if exists t1;
CREATE TABLE t1 (a int);
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN DROP TRIGGER test1; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE FUNCTION f1() returns int BEGIN DROP TRIGGER test1; return 1; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN load table t1 from master; END //
ERROR 0A000: LOAD TABLE is not allowed in stored procedures
CREATE FUNCTION f1() returns int BEGIN load table t1 from master; return 1; END //
ERROR 0A000: LOAD TABLE is not allowed in stored procedures
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN create table t2 (a int); END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE FUNCTION f1() returns int BEGIN create table t2 (a int); return 1; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN create index t1_i on t1 (a); END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE FUNCTION f1() returns int BEGIN create index t1_i on t1 (a); return 1; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN alter table t1 add column b int; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE FUNCTION f1() returns int BEGIN alter table t1 add column b int; return 1; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN rename table t1 to t2; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE FUNCTION f1() returns int BEGIN rename table t1 to t2; return 1; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN truncate table t1; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE FUNCTION f1() returns int BEGIN truncate table t1; return 1; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN drop table t1; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE FUNCTION f1() returns int BEGIN drop table t1; return 1; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN drop index t1_i on t1; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE FUNCTION f1() returns int BEGIN drop index t1_i on t1; return 1; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN unlock tables; END //
ERROR 0A000: UNLOCK is not allowed in stored procedures
CREATE FUNCTION f1() returns int BEGIN unlock tables; return 1; END //
ERROR 0A000: UNLOCK is not allowed in stored procedures
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN LOCK TABLE t1 READ; END //
ERROR 0A000: LOCK is not allowed in stored procedures
CREATE FUNCTION f1() returns int BEGIN LOCK TABLE t1 READ; return 1; END //
ERROR 0A000: LOCK is not allowed in stored procedures
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN create database mysqltest; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE FUNCTION f1() returns int BEGIN create database mysqltest; return 1; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN drop database mysqltest; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE FUNCTION f1() returns int BEGIN drop database mysqltest; return 1; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN create user 'mysqltest_1'; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE FUNCTION f1() returns int BEGIN create user 'mysqltest_1'; return 1; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN drop user 'mysqltest_1'; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE FUNCTION f1() returns int BEGIN drop user 'mysqltest_1'; return 1; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN rename user 'mysqltest_2' to 'mysqltest_1'; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE FUNCTION f1() returns int BEGIN rename user 'mysqltest_2' to 'mysqltest_1'; return 1; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN create view v1 as select 1; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE FUNCTION f1() returns int BEGIN create view v1 as select 1; return 1; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN alter view v1 as select 1; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE FUNCTION f1() returns int BEGIN alter view v1 as select 1; return 1; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN drop view v1; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE FUNCTION f1() returns int BEGIN drop view v1; return 1; END //
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN create trigger tr2 before insert on t1 for each row do select 1; END //
ERROR 2F003: Can't create a TRIGGER from within another stored routine
CREATE FUNCTION f1() returns int BEGIN create trigger tr2 before insert on t1 for each row do select 1; return 1; END //
ERROR 2F003: Can't create a TRIGGER from within another stored routine
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN drop function f1; END //
ERROR HY000: Can't drop or alter a FUNCTION from within another stored routine
CREATE FUNCTION f1() returns int BEGIN drop function f1; return 1; END //
ERROR HY000: Can't drop or alter a FUNCTION from within another stored routine
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN create function f2 () returns int return 1; END //
ERROR 2F003: Can't create a FUNCTION from within another stored routine
CREATE FUNCTION f1() returns int BEGIN create function f2 () returns int return 1; return 1; END //
ERROR 2F003: Can't create a FUNCTION from within another stored routine
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW
BEGIN
CREATE TEMPORARY TABLE t2 (a int);
DROP TEMPORARY TABLE t2;
END //
CREATE FUNCTION f1() returns int
BEGIN
CREATE TEMPORARY TABLE t2 (a int);
DROP TEMPORARY TABLE t2;
return 1;
END //
drop table t1;
drop function f1;
--- New file ---
+++ mysql-test/t/implicit_commit.test 05/11/11 16:51:04
--disable_warnings
drop table if exists t1;
--enable_warnings
#
# Test that statements which implicitly commit transaction are prohibited
# in stored function and triggers. Attempt to create function or trigger
# containing such statement should produce error (includes test for
# bug #13627).
#
CREATE TABLE t1 (a int);
delimiter //;
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN DROP TRIGGER test1; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE FUNCTION f1() returns int BEGIN DROP TRIGGER test1; return 1; END //
-- error ER_SP_BADSTATEMENT
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN load table t1 from master; END //
-- error ER_SP_BADSTATEMENT
CREATE FUNCTION f1() returns int BEGIN load table t1 from master; return 1; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN create table t2 (a int); END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE FUNCTION f1() returns int BEGIN create table t2 (a int); return 1; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN create index t1_i on t1 (a); END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE FUNCTION f1() returns int BEGIN create index t1_i on t1 (a); return 1; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN alter table t1 add column b int; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE FUNCTION f1() returns int BEGIN alter table t1 add column b int; return 1; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN rename table t1 to t2; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE FUNCTION f1() returns int BEGIN rename table t1 to t2; return 1; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN truncate table t1; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE FUNCTION f1() returns int BEGIN truncate table t1; return 1; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN drop table t1; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE FUNCTION f1() returns int BEGIN drop table t1; return 1; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN drop index t1_i on t1; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE FUNCTION f1() returns int BEGIN drop index t1_i on t1; return 1; END //
-- error ER_SP_BADSTATEMENT
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN unlock tables; END //
-- error ER_SP_BADSTATEMENT
CREATE FUNCTION f1() returns int BEGIN unlock tables; return 1; END //
-- error ER_SP_BADSTATEMENT
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN LOCK TABLE t1 READ; END //
-- error ER_SP_BADSTATEMENT
CREATE FUNCTION f1() returns int BEGIN LOCK TABLE t1 READ; return 1; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN create database mysqltest; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE FUNCTION f1() returns int BEGIN create database mysqltest; return 1; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN drop database mysqltest; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE FUNCTION f1() returns int BEGIN drop database mysqltest; return 1; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN create user 'mysqltest_1'; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE FUNCTION f1() returns int BEGIN create user 'mysqltest_1'; return 1; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN drop user 'mysqltest_1'; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE FUNCTION f1() returns int BEGIN drop user 'mysqltest_1'; return 1; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN rename user 'mysqltest_2' to 'mysqltest_1'; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE FUNCTION f1() returns int BEGIN rename user 'mysqltest_2' to 'mysqltest_1'; return 1; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN create view v1 as select 1; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE FUNCTION f1() returns int BEGIN create view v1 as select 1; return 1; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN alter view v1 as select 1; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE FUNCTION f1() returns int BEGIN alter view v1 as select 1; return 1; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN drop view v1; END //
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE FUNCTION f1() returns int BEGIN drop view v1; return 1; END //
-- error ER_SP_NO_RECURSIVE_CREATE
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN create trigger tr2 before insert on t1 for each row do select 1; END //
-- error ER_SP_NO_RECURSIVE_CREATE
CREATE FUNCTION f1() returns int BEGIN create trigger tr2 before insert on t1 for each row do select 1; return 1; END //
-- error ER_SP_NO_DROP_SP
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN drop function f1; END //
-- error ER_SP_NO_DROP_SP
CREATE FUNCTION f1() returns int BEGIN drop function f1; return 1; END //
-- error ER_SP_NO_RECURSIVE_CREATE
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN create function f2 () returns int return 1; END //
-- error ER_SP_NO_RECURSIVE_CREATE
CREATE FUNCTION f1() returns int BEGIN create function f2 () returns int return 1; return 1; END //
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW
BEGIN
CREATE TEMPORARY TABLE t2 (a int);
DROP TEMPORARY TABLE t2;
END //
CREATE FUNCTION f1() returns int
BEGIN
CREATE TEMPORARY TABLE t2 (a int);
DROP TEMPORARY TABLE t2;
return 1;
END //
delimiter ;//
drop table t1;
drop function f1;
--- 1.191/sql/sp_head.cc 2005-10-12 22:44:58 +03:00
+++ 1.192/sql/sp_head.cc 2005-11-11 16:51:03 +02:00
@@ -120,6 +120,45 @@
case SQLCOM_DEALLOCATE_PREPARE:
flags= sp_head::CONTAINS_DYNAMIC_SQL;
break;
+ case SQLCOM_CREATE_TABLE:
+ if (lex->create_info.options & HA_LEX_CREATE_TMP_TABLE)
+ flags= 0;
+ else
+ flags= sp_head::HAS_AUTOCOMMIT;
+ break;
+ case SQLCOM_DROP_TABLE:
+ if (lex->drop_temporary)
+ flags= 0;
+ else
+ flags= sp_head::HAS_AUTOCOMMIT;
+ break;
+ case SQLCOM_CREATE_INDEX:
+ case SQLCOM_CREATE_DB:
+ case SQLCOM_CREATE_VIEW:
+ case SQLCOM_CREATE_TRIGGER:
+ case SQLCOM_CREATE_USER:
+ case SQLCOM_ALTER_TABLE:
+ case SQLCOM_BEGIN:
+ case SQLCOM_RENAME_TABLE:
+ case SQLCOM_RENAME_USER:
+ case SQLCOM_DROP_INDEX:
+ case SQLCOM_DROP_DB:
+ case SQLCOM_DROP_USER:
+ case SQLCOM_DROP_VIEW:
+ case SQLCOM_DROP_TRIGGER:
+ case SQLCOM_TRUNCATE:
+ case SQLCOM_COMMIT:
+ case SQLCOM_ROLLBACK:
+ case SQLCOM_LOAD_MASTER_DATA:
+ case SQLCOM_LOCK_TABLES:
+ case SQLCOM_CREATE_PROCEDURE:
+ case SQLCOM_CREATE_SPFUNCTION:
+ case SQLCOM_ALTER_PROCEDURE:
+ case SQLCOM_ALTER_FUNCTION:
+ case SQLCOM_DROP_PROCEDURE:
+ case SQLCOM_DROP_FUNCTION:
+ flags= sp_head::HAS_AUTOCOMMIT;
+ break;
default:
flags= 0;
break;
--- 1.73/sql/sp_head.h 2005-09-22 23:46:49 +03:00
+++ 1.74/sql/sp_head.h 2005-11-11 16:51:03 +02:00
@@ -115,10 +115,12 @@
MULTI_RESULTS= 8, // Is set if a procedure with SELECT(s)
CONTAINS_DYNAMIC_SQL= 16, // Is set if a procedure with PREPARE/EXECUTE
IS_INVOKED= 32, // Is set if this sp_head is being used
- HAS_SET_AUTOCOMMIT_STMT = 64 // Is set if a procedure with 'set autocommit'
+ HAS_SET_AUTOCOMMIT_STMT= 64,// Is set if a procedure with 'set autocommit'
+ HAS_AUTOCOMMIT= 128 // Is set if a procedure with autocomit stmt
};
- int m_type; // TYPE_ENUM_FUNCTION or TYPE_ENUM_PROCEDURE
+ /* TYPE_ENUM_FUNCTION, TYPE_ENUM_PROCEDURE or TYPE_ENUM_TRIGGER */
+ int m_type;
uint m_flags; // Boolean attributes of a stored routine
enum enum_field_types m_returns; // For FUNCTIONs only
Field::geometry_type m_geom_returns;
| Thread |
|---|
| • bk commit into 5.0 tree (bell:1.2044) BUG#13627 | sanja | 11 Nov |