Skip to content

Commit

Permalink
Added case for indirect recusion
Browse files Browse the repository at this point in the history
Task: BABEL-2170

Signed-off-by: Deepakshi Mittal <[email protected]>
  • Loading branch information
deepakshi-mittal committed Nov 6, 2023
1 parent bed22b5 commit a25ba5b
Show file tree
Hide file tree
Showing 3 changed files with 133 additions and 0 deletions.
7 changes: 7 additions & 0 deletions contrib/babelfishpg_tsql/src/hooks.c
Original file line number Diff line number Diff line change
Expand Up @@ -733,6 +733,13 @@ pltsql_bbfViewHasInsteadofTrigger(Relation view, CmdType event)
{
return false; /** Direct recursive trigger case*/
}
else if (list_member_oid(triggerOids, current_tgoid))
{
/** Indirect recursive trigger case*/
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32)")));
}
}
}

Expand Down
67 changes: 67 additions & 0 deletions test/JDBC/expected/BABEL-2170-vu-verify.out
Original file line number Diff line number Diff line change
Expand Up @@ -513,6 +513,73 @@ int#!#varchar#!#varchar#!#numeric
DROP TRIGGER IF EXISTS babel_2170_vu_employees_view_iot_update;
GO



-- Recursive Trigger test Indirect Recursion trigger 1 -> trigger 2 -> trigger 1
CREATE TABLE babel_2170_vu_employees_rec
(
EmployeeID int NOT NULL,
EmployeeName VARCHAR(50),
EmployeeAddress VARCHAR(50),
MonthSalary NUMERIC(10, 2)
)
GO

INSERT INTO babel_2170_vu_employees_rec VALUES(1, 'amber', '1st Street', '1000');
INSERT INTO babel_2170_vu_employees_rec VALUES(2, 'angel', '1st Street', '2000');
GO
~~ROW COUNT: 1~~

~~ROW COUNT: 1~~


CREATE VIEW babel_2170_vu_employees_view_rec AS
SELECT EmployeeID,
EmployeeName,
EmployeeAddress,
MonthSalary
FROM babel_2170_vu_employees_rec
WHERE EmployeeName LIKE 'a%';
GO

CREATE TRIGGER babel_2170_vu_employees_view_iot_rec ON babel_2170_vu_employees_view
INSTEAD OF UPDATE
AS
BEGIN
UPDATE babel_2170_vu_employees_view_rec SET MonthSalary = MonthSalary +1 WHERE EmployeeID = 2;
END
GO

CREATE TRIGGER babel_2170_vu_employees_view_iot_rec2 ON babel_2170_vu_employees_view_rec
INSTEAD OF UPDATE
AS
BEGIN
UPDATE babel_2170_vu_employees_view SET MonthSalary = MonthSalary +1 WHERE EmployeeID = 2;
END
GO

UPDATE babel_2170_vu_employees_view SET MonthSalary = MonthSalary +100 WHERE EmployeeID = 2;
GO
~~ERROR (Code: 33557097)~~

~~ERROR (Message: Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32))~~



-- UPDATE babel_2170_vu_employees_view_rec SET MonthSalary = MonthSalary +100 WHERE EmployeeID = 2;
-- GO
DROP TRIGGER IF EXISTS babel_2170_vu_employees_view_iot_rec;
GO

DROP TRIGGER IF EXISTS babel_2170_vu_employees_view_iot_rec2;
GO

DROP VIEW IF EXISTS babel_2170_vu_employees_view_rec;
GO

DROP TABLE IF EXISTS babel_2170_vu_employees_rec;
GO

-- test multi-db mode
SELECT set_config('role', 'jdbc_user', false);
GO
Expand Down
59 changes: 59 additions & 0 deletions test/JDBC/input/triggers/BABEL-2170-vu-verify.sql
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,65 @@ GO
DROP TRIGGER IF EXISTS babel_2170_vu_employees_view_iot_update;
GO


-- Recursive Trigger test Indirect Recursion trigger 1 -> trigger 2 -> trigger 1

CREATE TABLE babel_2170_vu_employees_rec
(
EmployeeID int NOT NULL,
EmployeeName VARCHAR(50),
EmployeeAddress VARCHAR(50),
MonthSalary NUMERIC(10, 2)
)
GO

INSERT INTO babel_2170_vu_employees_rec VALUES(1, 'amber', '1st Street', '1000');
INSERT INTO babel_2170_vu_employees_rec VALUES(2, 'angel', '1st Street', '2000');
GO

CREATE VIEW babel_2170_vu_employees_view_rec AS
SELECT EmployeeID,
EmployeeName,
EmployeeAddress,
MonthSalary
FROM babel_2170_vu_employees_rec
WHERE EmployeeName LIKE 'a%';
GO

CREATE TRIGGER babel_2170_vu_employees_view_iot_rec ON babel_2170_vu_employees_view
INSTEAD OF UPDATE
AS
BEGIN
UPDATE babel_2170_vu_employees_view_rec SET MonthSalary = MonthSalary +1 WHERE EmployeeID = 2;
END
GO

CREATE TRIGGER babel_2170_vu_employees_view_iot_rec2 ON babel_2170_vu_employees_view_rec
INSTEAD OF UPDATE
AS
BEGIN
UPDATE babel_2170_vu_employees_view SET MonthSalary = MonthSalary +1 WHERE EmployeeID = 2;
END
GO

UPDATE babel_2170_vu_employees_view SET MonthSalary = MonthSalary +100 WHERE EmployeeID = 2;
GO

-- UPDATE babel_2170_vu_employees_view_rec SET MonthSalary = MonthSalary +100 WHERE EmployeeID = 2;
-- GO

DROP TRIGGER IF EXISTS babel_2170_vu_employees_view_iot_rec;
GO

DROP TRIGGER IF EXISTS babel_2170_vu_employees_view_iot_rec2;
GO

DROP VIEW IF EXISTS babel_2170_vu_employees_view_rec;
GO

DROP TABLE IF EXISTS babel_2170_vu_employees_rec;
GO

-- test multi-db mode
SELECT set_config('role', 'jdbc_user', false);
GO
Expand Down

0 comments on commit a25ba5b

Please sign in to comment.