From aa9e31fdec385021e0cddd9394142c8ceb7348c0 Mon Sep 17 00:00:00 2001 From: douxin Date: Sun, 18 Feb 2024 19:33:17 +0800 Subject: [PATCH] [bugfix] repair trigger execute fail due to the lack of 'return new' statement --- .../mysql/MySqlToOpenGaussOutputVisitor.java | 10 +++--- .../sqltranslator/SqlTranslateTest.java | 6 ++++ .../expect/createTrigger_statement_01.sql | 5 ++- .../expect/createTrigger_statement_02.sql | 9 ++++-- .../expect/createTrigger_statement_03.sql | 9 ++++++ .../expect/createTrigger_statement_04.sql | 20 ++++++++++++ .../input/createTrigger_statement_01.sql | 32 +++++++++++-------- .../input/createTrigger_statement_02.sql | 7 +++- .../input/createTrigger_statement_03.sql | 7 +++- .../input/createTrigger_statement_04.sql | 5 +++ 10 files changed, 83 insertions(+), 27 deletions(-) create mode 100644 src/test/resources/dialect/mysql/expect/createTrigger_statement_04.sql create mode 100644 src/test/resources/dialect/mysql/input/createTrigger_statement_04.sql diff --git a/src/main/java/org/opengauss/sqltranslator/dialect/mysql/MySqlToOpenGaussOutputVisitor.java b/src/main/java/org/opengauss/sqltranslator/dialect/mysql/MySqlToOpenGaussOutputVisitor.java index 7aa7e14..dc14623 100644 --- a/src/main/java/org/opengauss/sqltranslator/dialect/mysql/MySqlToOpenGaussOutputVisitor.java +++ b/src/main/java/org/opengauss/sqltranslator/dialect/mysql/MySqlToOpenGaussOutputVisitor.java @@ -2103,12 +2103,10 @@ public class MySqlToOpenGaussOutputVisitor extends MySqlOutputVisitor { println(); } } - if (! (x.getBody() instanceof SQLSetStatement)) { - if (x.isUpdate() || x.isInsert()) { - println("RETURN NEW;"); - } else { - println("RETURN OLD;"); - } + if (x.isUpdate() || x.isInsert()) { + println("RETURN NEW;"); + } else { + println("RETURN OLD;"); } println("END;"); println("$$ LANGUAGE plpgsql;"); diff --git a/src/test/java/org/opengauss/sqltranslator/SqlTranslateTest.java b/src/test/java/org/opengauss/sqltranslator/SqlTranslateTest.java index 2a11501..9ad0275 100644 --- a/src/test/java/org/opengauss/sqltranslator/SqlTranslateTest.java +++ b/src/test/java/org/opengauss/sqltranslator/SqlTranslateTest.java @@ -121,6 +121,12 @@ public class SqlTranslateTest { assertEquals(sqlContents[1], sqlContents[2]); } + @Test + public void test_createTrigger04() throws IOException { + String[] sqlContents = execFile("createTrigger_statement_04.sql"); + assertEquals(sqlContents[1], sqlContents[2]); + } + @Test public void test_dataType() throws IOException { String[] sqlContents = execFile("dataType_statement.sql"); diff --git a/src/test/resources/dialect/mysql/expect/createTrigger_statement_01.sql b/src/test/resources/dialect/mysql/expect/createTrigger_statement_01.sql index 19a1038..7993e2d 100644 --- a/src/test/resources/dialect/mysql/expect/createTrigger_statement_01.sql +++ b/src/test/resources/dialect/mysql/expect/createTrigger_statement_01.sql @@ -1,13 +1,12 @@ CREATE TABLE t_employee ( work_year INTEGER ); --- DEFINER `root`@`%` +-- DEFINER `mysql_test`@`%` CREATE OR REPLACE FUNCTION createFunction_1692ab45b3a540ca863d5612ed34a1b0() RETURNS TRIGGER AS $$ DECLARE BEGIN -new.work_year := 0; -new.work_year := 1; +new.work_year := 10; WHILE new.work_year > 0 LOOP new.work_year := new.work_year - 1; END LOOP; diff --git a/src/test/resources/dialect/mysql/expect/createTrigger_statement_02.sql b/src/test/resources/dialect/mysql/expect/createTrigger_statement_02.sql index c8391c8..159fb54 100644 --- a/src/test/resources/dialect/mysql/expect/createTrigger_statement_02.sql +++ b/src/test/resources/dialect/mysql/expect/createTrigger_statement_02.sql @@ -1,13 +1,18 @@ +CREATE TABLE account ( + amount INTEGER +); +SET @wongloong = 1; -- DEFINER `mysql_test`@`%` CREATE OR REPLACE FUNCTION createFunction_5e55ac4ac3e940efb7e838c4b62128cf() RETURNS TRIGGER AS $$ DECLARE BEGIN SET @wongloong = @wongloong + NEW.amount; +RETURN NEW; END; $$ LANGUAGE plpgsql; -CREATE TRIGGER test1.ins_sum -BEFORE INSERT ON test1.account +CREATE TRIGGER ins_sum +BEFORE INSERT ON account FOR EACH ROW EXECUTE PROCEDURE createFunction_5e55ac4ac3e940efb7e838c4b62128cf(); \ No newline at end of file diff --git a/src/test/resources/dialect/mysql/expect/createTrigger_statement_03.sql b/src/test/resources/dialect/mysql/expect/createTrigger_statement_03.sql index 67ff6d8..54dc9b8 100644 --- a/src/test/resources/dialect/mysql/expect/createTrigger_statement_03.sql +++ b/src/test/resources/dialect/mysql/expect/createTrigger_statement_03.sql @@ -1,3 +1,12 @@ +CREATE TABLE table1 ( + id INTEGER, + name VARCHAR(50) +); +CREATE TABLE table2 ( + id INTEGER, + name VARCHAR(50) +); +-- DEFINER `mysql_test`@`%` CREATE OR REPLACE FUNCTION createFunction_a92a685008044eac9628e1d7ff309c43() RETURNS TRIGGER AS $$ DECLARE diff --git a/src/test/resources/dialect/mysql/expect/createTrigger_statement_04.sql b/src/test/resources/dialect/mysql/expect/createTrigger_statement_04.sql new file mode 100644 index 0000000..111edd6 --- /dev/null +++ b/src/test/resources/dialect/mysql/expect/createTrigger_statement_04.sql @@ -0,0 +1,20 @@ +CREATE TABLE table3 ( + id INTEGER, + name VARCHAR(10), + col VARCHAR(20), + PRIMARY KEY (id) +); +-- DEFINER `mysql_test`@`%` +CREATE OR REPLACE FUNCTION createFunction_58e6c454b7864573b71b7d6fb6b252c0() RETURNS TRIGGER AS +$$ +DECLARE +BEGIN +new.col := concat(new.name, new.id); +RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER trigger3 +BEFORE INSERT ON table3 +FOR EACH ROW +EXECUTE PROCEDURE createFunction_58e6c454b7864573b71b7d6fb6b252c0(); \ No newline at end of file diff --git a/src/test/resources/dialect/mysql/input/createTrigger_statement_01.sql b/src/test/resources/dialect/mysql/input/createTrigger_statement_01.sql index 349b20d..1fb1c54 100644 --- a/src/test/resources/dialect/mysql/input/createTrigger_statement_01.sql +++ b/src/test/resources/dialect/mysql/input/createTrigger_statement_01.sql @@ -1,18 +1,22 @@ create table t_employee(work_year int); -CREATE Definer=`root`@`%` TRIGGER tr_before_insert_employee - BEFORE UPDATE - ON t_employee - FOR EACH ROW - BEGIN - SET new.work_year = 0; - SET new.work_year = 1; - while new.work_year>0 do - set new.work_year=new.work_year-1; - end while; +-- delimiter $ +CREATE DEFINER=`mysql_test`@`%` TRIGGER tr_before_insert_employee BEFORE UPDATE ON t_employee FOR EACH ROW +BEGIN + SET new.work_year = 10; + while new.work_year>0 do + set new.work_year=new.work_year-1; + end while; - repeat - set new.work_year=new.work_year+1; - until new.work_year>10 end repeat; - END; + repeat + set new.work_year=new.work_year+1; + until new.work_year>10 + end repeat; +END; +-- $ +-- delimiter ; +insert into t_employee values(5); +update t_employee set work_year = 20; +select * from t_employee; +-- 针对update,总是返回11 diff --git a/src/test/resources/dialect/mysql/input/createTrigger_statement_02.sql b/src/test/resources/dialect/mysql/input/createTrigger_statement_02.sql index 8f56911..394784d 100644 --- a/src/test/resources/dialect/mysql/input/createTrigger_statement_02.sql +++ b/src/test/resources/dialect/mysql/input/createTrigger_statement_02.sql @@ -1 +1,6 @@ -CREATE DEFINER=`mysql_test`@`%` TRIGGER test1.ins_sum BEFORE INSERT ON test1.account FOR EACH ROW SET @wongloong = @wongloong + NEW.amount; \ No newline at end of file +create table account(amount int); +set @wongloong=1; +CREATE DEFINER=`mysql_test`@`%` TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @wongloong = @wongloong + NEW.amount; +insert into account values(3); +select @wongloong; +-- 返回4 \ No newline at end of file diff --git a/src/test/resources/dialect/mysql/input/createTrigger_statement_03.sql b/src/test/resources/dialect/mysql/input/createTrigger_statement_03.sql index 6b7608d..831de89 100644 --- a/src/test/resources/dialect/mysql/input/createTrigger_statement_03.sql +++ b/src/test/resources/dialect/mysql/input/createTrigger_statement_03.sql @@ -1 +1,6 @@ -create trigger trigger1 before insert on table1 for each row insert into table2 values(new.id, new.name); \ No newline at end of file +create table table1(id int, name varchar(50)); +create table table2(id int, name varchar(50)); +create DEFINER=`mysql_test`@`%` trigger trigger1 before insert on table1 for each row insert into table2 values(new.id, new.name); +insert into table1 values(1, 'test1'); +select * from table2; +-- table2新增一行和table1相同的数据 \ No newline at end of file diff --git a/src/test/resources/dialect/mysql/input/createTrigger_statement_04.sql b/src/test/resources/dialect/mysql/input/createTrigger_statement_04.sql new file mode 100644 index 0000000..7a85219 --- /dev/null +++ b/src/test/resources/dialect/mysql/input/createTrigger_statement_04.sql @@ -0,0 +1,5 @@ +create table table3 (id int, name varchar(10), col varchar(20), primary key(id)); +create DEFINER=`mysql_test`@`%` trigger trigger3 before insert on table3 for each row set new.col = concat(new.name, new.id); +insert into table3(id, name) values(1, 'test'); +select * from table3; +-- table1的col列内容为test1 \ No newline at end of file -- Gitee