List:Internals« Previous MessageNext Message »
From:sanja Date:October 16 2005 7:06am
Subject:bk commit into 5.0 tree (bell:1.2044) BUG#13627
View as plain text  
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/10/16 10:06:06 bell@stripped +4 -0
  check context (Stored Function/Trigger) during parsing statements with implicit commit (BUG#13627)

  mysql-test/t/implicit_commit.test
    1.1 05/10/16 10:05:50 bell@stripped +121 -0
    New BitKeeper file ``mysql-test/t/implicit_commit.test''

  mysql-test/r/implicit_commit.result
    1.1 05/10/16 10:05:50 bell@stripped +91 -0
    New BitKeeper file ``mysql-test/r/implicit_commit.result''

  mysql-test/t/implicit_commit.test
    1.0 05/10/16 10:05:50 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.0 05/10/16 10:05:50 bell@stripped +0 -0
    BitKeeper file /home/bell/mysql/bk/work-bug5-5.0/mysql-test/r/implicit_commit.result

  sql/sql_yacc.yy
    1.435 05/10/16 10:05:49 bell@stripped +63 -6
    check context (Stored Function/Trigger) during parsing statements with implicit commit

  sql/sp_head.h
    1.74 05/10/16 10:05:49 bell@stripped +2 -1
    fixed comment

# 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-10-16 10:05:49 +03:00
@@ -1135,6 +1135,11 @@
 	{
 	  THD *thd= YYTHD;
 	  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_TABLE;
 	  if (!lex->select_lex.add_table_to_list(thd, $5, NULL,
 						 TL_OPTION_UPDATING,
@@ -1186,6 +1191,11 @@
 	  opt_create_database_options
 	  {
 	    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_DB;
 	    lex->name=$4.str;
             lex->create_info.options=$3;
@@ -1262,6 +1272,11 @@
 	  {
 	    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_CREATE_VIEW;
 	    /* first table in list is target VIEW name */
 	    if (!lex->select_lex.add_table_to_list(thd, $7, NULL, 0))
@@ -1305,7 +1320,11 @@
           {
             LEX *lex= Lex;
             sp_head *sp= lex->sphead;
-            
+            if (sp && sp->m_type != TYPE_ENUM_PROCEDURE)
+            {
+              my_error(ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG, MYF(0));
+              YYABORT;
+            }
             lex->sql_command= SQLCOM_CREATE_TRIGGER;
             sp->init_strings(YYTHD, lex, $3);
             /* Restore flag if it was cleared above */
@@ -1333,7 +1352,13 @@
           }
 	| CREATE USER clear_privileges grant_list
 	  {
-	    Lex->sql_command = SQLCOM_CREATE_USER;
+            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_USER;
           }
 	;
 
@@ -3425,6 +3450,11 @@
 	    THD *thd= YYTHD;
 	    LEX *lex= thd->lex;
 	    lex->sql_command= SQLCOM_CREATE_VIEW;
+            if (lex->sphead && lex->sphead->m_type != TYPE_ENUM_PROCEDURE)
+            {
+              my_error(ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG, MYF(0));
+              YYABORT;
+            }
 	    lex->create_view_mode= VIEW_ALTER;
 	    /* first table in list is target VIEW name */
 	    lex->select_lex.add_table_to_list(thd, $6, NULL, 0);
@@ -3862,7 +3892,13 @@
 	{}
 	| RENAME USER clear_privileges rename_list
           {
-	    Lex->sql_command = SQLCOM_RENAME_USER;
+            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_USER;
           }
 	;
 
@@ -5985,14 +6021,14 @@
 	{
 	  LEX *lex=Lex;
 	  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;
           }
+	  lex->drop_temporary= $2;
+	  lex->drop_if_exists= $4;
 	}
 	| DROP INDEX_SYM ident ON table_ident {}
 	  {
@@ -6013,6 +6049,11 @@
 	| DROP DATABASE if_exists 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_DB;
 	    lex->drop_if_exists=$3;
 	    lex->name=$4.str;
@@ -6043,7 +6084,13 @@
 	  }
 	| DROP USER clear_privileges user_list
 	  {
-	    Lex->sql_command = SQLCOM_DROP_USER;
+            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_USER;
           }
 	| DROP VIEW_SYM if_exists table_list opt_restrict
 	  {
@@ -6060,6 +6107,11 @@
         | DROP TRIGGER_SYM sp_name
           {
             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_TRIGGER;
             lex->spname= $3;
           }
@@ -6383,6 +6435,11 @@
 	TRUNCATE_SYM opt_table_sym table_name
 	{
 	  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_TRUNCATE;
 	  lex->select_lex.options= 0;
 	  lex->select_lex.init_order();
--- New file ---
+++ mysql-test/r/implicit_commit.result	05/10/16 10:05:50
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
drop table t1;

--- New file ---
+++ mysql-test/t/implicit_commit.test	05/10/16 10:05:50
--disable_warnings
drop table if exists t1;
--enable_warnings
#
# statements with implicit commit (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 //

delimiter ;//
drop table t1;


--- 1.73/sql/sp_head.h	2005-09-22 23:46:49 +03:00
+++ 1.74/sql/sp_head.h	2005-10-16 10:05:49 +03:00
@@ -118,7 +118,8 @@
     HAS_SET_AUTOCOMMIT_STMT = 64 // Is set if a procedure with 'set autocommit'
   };
 
-  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#13627sanja16 Oct