diff --git a/contrib/dolphin/expected/single_line_trigger.out b/contrib/dolphin/expected/single_line_trigger.out index 288edcffb4cc128d65395859dc94df9f530684a6..4c03a615cfb4ed8809eb7c77340e512be8ac23f2 100644 --- a/contrib/dolphin/expected/single_line_trigger.out +++ b/contrib/dolphin/expected/single_line_trigger.out @@ -411,11 +411,108 @@ select id, foodtype from food; 2 | pad (9 rows) +--bugfix for trigger gram +drop table if exists t1; +drop table if exists t4; +NOTICE: table "t4" does not exist, skipping +create table t1 (i int primary key); +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "t1_pkey" for table "t1" +create table t4 (l int primary key); +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "t4_pkey" for table "t4" +insert into t1 values(1); +delimiter | +create trigger t4_bi before insert on t4 for each row +begin +declare k int; +select i from t1 where i=1 into k; +set new.l= k+1; +end| +delimiter ; +insert into t4 values(222); +select * from t4; + l +--- + 2 +(1 row) + +drop table if exists t1 cascade; +drop table if exists t4 cascade; +--open b_compatibility_mode +create table t_create_trigger_001(a int); +create table t_create_trigger_002(a int); +set dolphin.b_compatibility_mode = 1; +create trigger trigger004 +after insert on t_create_trigger_001 +for each row +begin + insert into t_create_trigger_002 values(3); +end; +/ +show create trigger trigger004; +--? SQL Original Statement .* +--?.* +--? DECLARE begin.* +--?.* +--?.* +(1 row) + +delimiter // +create trigger trigger005 +after insert on t_create_trigger_001 +for each row +begin + insert into t_create_trigger_002 values(3); +end; +// +delimiter ; +show create trigger trigger005; +--? SQL Original Statement .* +--?.* +--? BEGIN insert into t_create_trigger_002.* +--?.* +(1 row) + +drop trigger trigger005; +drop trigger trigger004; +--close b_compatibility_mode +set dolphin.b_compatibility_mode = 0; +create trigger trigger004 +after insert on t_create_trigger_001 +for each row +begin + insert into t_create_trigger_002 values(3); +end; +/ +show create trigger trigger004; +--? SQL Original Statement .* +--?.* +--? DECLARE begin.* +--?.* +--?.* +(1 row) + +delimiter // +create trigger trigger005 +after insert on t_create_trigger_001 +for each row +begin + insert into t_create_trigger_002 values(3); +end; +// +delimiter ; +show create trigger trigger005; +--? SQL Original Statement .* +--?.* +--? BEGIN insert into t_create_trigger_002.* +--?.* +(1 row) + +drop table t_create_trigger_001; +drop table t_create_trigger_002; reset enable_set_variable_b_format; drop schema db_mysql cascade; -NOTICE: drop cascades to 4 other objects +NOTICE: drop cascades to 3 other objects DETAIL: drop cascades to table t -drop cascades to table t1 drop cascades to table animals drop cascades to table food reset current_schema; diff --git a/contrib/dolphin/plugin_parser/gram.y b/contrib/dolphin/plugin_parser/gram.y index ebe7b8d0116cc5178a546d95d8538e455d5d2068..3036ac3985f7fada79cc79cf5e592655a981f436 100644 --- a/contrib/dolphin/plugin_parser/gram.y +++ b/contrib/dolphin/plugin_parser/gram.y @@ -752,7 +752,7 @@ static inline SortByNulls GetNullOrderRule(SortByDir sortBy, SortByNulls nullRul %type OptBlockchainWith OptAlterToBlockchain %type TriggerForSpec TriggerForType ForeignTblWritable -%type TriggerActionTime +%type TriggerActionTime DolphinTriggerActionTime %type TriggerEvents TriggerOneEvent %type TriggerFuncArg %type TriggerWhen @@ -14818,7 +14818,7 @@ DropDataSourceStmt: DROP DATA_P SOURCE_P name opt_drop_behavior *****************************************************************************/ CreateTrigStmt: - CREATE opt_or_replace definer_user TRIGGER qualified_trigger_name TriggerActionTime TriggerEvents ON + CREATE opt_or_replace definer_user TRIGGER qualified_trigger_name DolphinTriggerActionTime TriggerEvents ON dolphin_qualified_name TriggerForSpec TriggerWhen EXECUTE PROCEDURE func_name '(' TriggerFuncArgs ')' { @@ -14884,7 +14884,7 @@ CreateTrigStmt: n->is_follows = NULL; $$ = (Node *)n; } - | CREATE opt_or_replace definer_user TRIGGER qualified_trigger_name TriggerActionTime TriggerEvents ON + | CREATE opt_or_replace definer_user TRIGGER qualified_trigger_name DolphinTriggerActionTime TriggerEvents ON dolphin_qualified_name TriggerForSpec TriggerWhen trigger_order { @@ -14927,7 +14927,7 @@ CreateTrigStmt: n->constrrel = NULL; $$ = (Node *)n; } - | CREATE opt_or_replace definer_user TRIGGER IF_P NOT EXISTS qualified_trigger_name TriggerActionTime TriggerEvents ON + | CREATE opt_or_replace definer_user TRIGGER IF_P NOT EXISTS qualified_trigger_name DolphinTriggerActionTime TriggerEvents ON dolphin_qualified_name TriggerForSpec TriggerWhen trigger_order { @@ -14985,11 +14985,6 @@ triggerbody_subprogram_or_single: { GetSessionContext()->single_line_trigger_begin = yylloc; } - if (strcmp(";", u_sess->attr.attr_common.delimiter_name) != 0 || - GetSessionContext()->enableBCmptMode) - { - GetSessionContext()->dolphin_kw_mask = B_KWMASK_CREATE_TRIGGER; - } } trigger_body_stmt { Node* node = (Node*)$2; @@ -15023,7 +15018,7 @@ trigger_body_stmt: | VariableSetStmt { $$ = (Node*)$1; } | CallFuncStmt { $$ = (Node*)$1; } | subprogram_body { $$ = (Node*)$1; } - | BEGIN_B_BLOCK b_proc_body {$$ = (Node*)$2;} + | BEGIN_B_BLOCK b_proc_body { $$ = (Node*)$2; } ; TriggerActionTime: @@ -15032,6 +15027,17 @@ TriggerActionTime: | INSTEAD OF { $$ = TRIGGER_TYPE_INSTEAD; } ; +DolphinTriggerActionTime: + TriggerActionTime + { + /* Notice: Do not use this gram except in create trigger statement */ + if (strcmp(";", u_sess->attr.attr_common.delimiter_name) != 0 ) + { + GetSessionContext()->dolphin_kw_mask = B_KWMASK_CREATE_TRIGGER; + } + $$ = $1; + } + TriggerEvents: TriggerOneEvent { $$ = $1; } diff --git a/contrib/dolphin/sql/single_line_trigger.sql b/contrib/dolphin/sql/single_line_trigger.sql index 92bf01126178dc06c402401ffd7899ed35de80f1..d30b8bf402d96deb8a51258899a900f6deeea6e1 100644 --- a/contrib/dolphin/sql/single_line_trigger.sql +++ b/contrib/dolphin/sql/single_line_trigger.sql @@ -325,6 +325,83 @@ insert into animals (id, name) values(2,'cat'); select * from animals; select id, foodtype from food; +--bugfix for trigger gram +drop table if exists t1; +drop table if exists t4; +create table t1 (i int primary key); +create table t4 (l int primary key); +insert into t1 values(1); + +delimiter | +create trigger t4_bi before insert on t4 for each row +begin +declare k int; +select i from t1 where i=1 into k; +set new.l= k+1; +end| + +delimiter ; + +insert into t4 values(222); +select * from t4; + +drop table if exists t1 cascade; +drop table if exists t4 cascade; + +--open b_compatibility_mode +create table t_create_trigger_001(a int); +create table t_create_trigger_002(a int); + +set dolphin.b_compatibility_mode = 1; +create trigger trigger004 +after insert on t_create_trigger_001 +for each row +begin + insert into t_create_trigger_002 values(3); +end; +/ + +show create trigger trigger004; + +delimiter // +create trigger trigger005 +after insert on t_create_trigger_001 +for each row +begin + insert into t_create_trigger_002 values(3); +end; +// +delimiter ; + +show create trigger trigger005; + +drop trigger trigger005; +drop trigger trigger004; +--close b_compatibility_mode +set dolphin.b_compatibility_mode = 0; +create trigger trigger004 +after insert on t_create_trigger_001 +for each row +begin + insert into t_create_trigger_002 values(3); +end; +/ + +show create trigger trigger004; + +delimiter // +create trigger trigger005 +after insert on t_create_trigger_001 +for each row +begin + insert into t_create_trigger_002 values(3); +end; +// +delimiter ; + +show create trigger trigger005; +drop table t_create_trigger_001; +drop table t_create_trigger_002; reset enable_set_variable_b_format;