blob: 20c5e6517b2d4fa5dde05fb1dc78c63f9aa17b0f [file]
\set ECHO none
SELECT pg_sleep(3);
pg_sleep
----------
(1 row)
/*
* DBMS_ALERT is used for one-way communication of one session to other.
*
* This session mainly sends signals for testing the alert functionality in
* session B and C.
*
* The following alerts are used to ensure that signals are sent at correct
* times to session B for testing. These signals are sent from session B
* indicating completion of an event.
* After the signal is received, the next required signal for testing is sent
* from this session.
*/
SELECT dbms_alert.register('b1');
register
----------
(1 row)
SELECT dbms_alert.register('b2');
register
----------
(1 row)
SELECT dbms_alert.register('b3');
register
----------
(1 row)
SELECT dbms_alert.register('b4');
register
----------
(1 row)
SELECT dbms_alert.register('b5');
register
----------
(1 row)
SELECT dbms_alert.signal('a1','Msg1 for a1');
signal
--------
(1 row)
SELECT dbms_alert.signal('a2','Msg1 for a2');
signal
--------
(1 row)
/*
* Test: defered_signal
* The signal is received only when the signalling transaction commits.
* To test this, an explict BEGIN-COMMIT block is used.
*/
SELECT dbms_alert.signal('tds','Begin defered_signal test');
signal
--------
(1 row)
BEGIN;
SELECT dbms_alert.signal('tds','Testing defered_signal');
signal
--------
(1 row)
/* The signal is received while transaction is running */
SELECT dbms_alert.waitone('b1',20);
waitone
---------------------------------
("Transaction still running",0)
(1 row)
COMMIT;
/* The signal is received after transaction completed.
* After this the tds signal is received in session B indicating that the
* signal is received only after commit.
*/
SELECT dbms_alert.waitone('b1',20);
waitone
-----------------------------
("Transaction committed",0)
(1 row)
SELECT dbms_alert.waitone('b2',20);
waitone
----------------------------------------
("to check unregistered alert wait",0)
(1 row)
/* This signals a3 which is not registered in Session B */
SELECT dbms_alert.signal('a3','Msg1 for a3');
signal
--------
(1 row)
/* alert a4 is signalled soon after a3 */
SELECT dbms_alert.signal('a4','Test- Register after signal');
signal
--------
(1 row)
/* This signal indicates at remove() is called */
SELECT dbms_alert.waitone('b3',20);
waitone
-------------------------
("remove(a1) called",0)
(1 row)
/* Send signal which is removed in session B */
SELECT dbms_alert.signal('a1','Msg2 for a1');
signal
--------
(1 row)
SELECT dbms_alert.waitone('b4',20);
waitone
--------------------------------
("to check unremoved alert",0)
(1 row)
/* Send signal which is registered in B and not removed */
SELECT dbms_alert.signal('a4','Msg1 for a4');
signal
--------
(1 row)
/* This signal inidcates that removeall() is called */
SELECT dbms_alert.waitone('b5',20);
waitone
------------------------
("removeall called",0)
(1 row)
/* Send a signal to test if session B receives it after removeall() */
SELECT dbms_alert.signal('a2','Msg2 for a2');
signal
--------
(1 row)
/* cleanup */
SELECT dbms_alert.removeall();
removeall
-----------
(1 row)