Skip to content

Commit

Permalink
[#3460] YSQL: Integrate Orafce extension with Yugabyte
Browse files Browse the repository at this point in the history
Summary:
Orafce is a Postgresql extension that contains functions and operators
that emulate a subset of packages and features from the Oracle RDBMS.
This commit add support for Orafce in YSQL and bundles the extension
with the default Yugabyte package.
To enable Orafce on a database simply run:
```
CREATE EXTENSION IF NOT EXISTS orafce;
```

Test Plan:
To run regression tests for orafce, execute the following command.
```
ybd --java-test org.yb.pgsql.TestPgRegressExtension
```

Reviewers: tnayak, mihnea

Reviewed By: mihnea

Subscribers: tramer, karthik, kannan, yql

Differential Revision: https://phabricator.dev.yugabyte.com/D10771
  • Loading branch information
ramsrivatsa committed Mar 11, 2021
1 parent 8708678 commit 7a3c383
Show file tree
Hide file tree
Showing 99 changed files with 34,008 additions and 1 deletion.
4,402 changes: 4,402 additions & 0 deletions src/postgres/src/test/regress/expected/yb_pg_orafce.out

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions src/postgres/src/test/regress/expected/yb_pg_orafce2.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
-- 2) fails and throws error: 'ERROR: could not determine polymorphic type
-- because input has type "unknown"'
select decode('2012-01-01', '2012-01-01', 23, '2012-01-02', 24);
ERROR: could not determine polymorphic type because input has type unknown
126 changes: 126 additions & 0 deletions src/postgres/src/test/regress/expected/yb_pg_orafce_aggregates.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
-- Tests for the aggregate listagg
SELECT listagg(i::text) from generate_series(1,3) g(i);
listagg
---------
123
(1 row)

SELECT listagg(i::text, ',') from generate_series(1,3) g(i);
listagg
---------
1,2,3
(1 row)

SELECT coalesce(listagg(i::text), '<NULL>') from (SELECT ''::text) g(i);
coalesce
----------

(1 row)

SELECT coalesce(listagg(i::text), '<NULL>') from generate_series(1,0) g(i);
coalesce
----------
<NULL>
(1 row)

SELECT wm_concat(i::text) from generate_series(1,3) g(i);
wm_concat
-----------
1,2,3
(1 row)

-- Tests for the aggregate median( real | double )
CREATE FUNCTION checkMedianRealOdd() RETURNS real AS $$
DECLARE
med real;

BEGIN
CREATE TABLE median_test (salary real);
INSERT INTO median_test VALUES (4500);
INSERT INTO median_test VALUES (NULL);
INSERT INTO median_test VALUES (2100);
INSERT INTO median_test VALUES (3600);
INSERT INTO median_test VALUES (4000);
SELECT into med median(salary) from median_test;
DROP TABLE median_test;
return med;

END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION checkMedianRealEven() RETURNS real AS $$
DECLARE
med real;

BEGIN
CREATE TABLE median_test (salary real);
INSERT INTO median_test VALUES (4500);
INSERT INTO median_test VALUES (1500);
INSERT INTO median_test VALUES (2100);
INSERT INTO median_test VALUES (3600);
INSERT INTO median_test VALUES (1000);
INSERT INTO median_test VALUES (4000);
select into med median(salary) from median_test;
DROP TABLE median_test;
return med;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION checkMedianDoubleOdd() RETURNS double precision AS $$
DECLARE
med double precision;
BEGIN
CREATE TABLE median_test (salary double precision);
INSERT INTO median_test VALUES (4500);
INSERT INTO median_test VALUES (1500);
INSERT INTO median_test VALUES (2100);
INSERT INTO median_test VALUES (3600);
INSERT INTO median_test VALUES (4000);
select into med median(salary) from median_test;
DROP TABLE median_test;
return med;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION checkMedianDoubleEven() RETURNS double precision AS $$
DECLARE
med double precision;

BEGIN
CREATE TABLE median_test (salary double precision);
INSERT INTO median_test VALUES (4500);
INSERT INTO median_test VALUES (1500);
INSERT INTO median_test VALUES (2100);
INSERT INTO median_test VALUES (3600);
INSERT INTO median_test VALUES (4000);
INSERT INTO median_test VALUES (1000);
select into med median(salary) from median_test;
DROP TABLE median_test;
return med;
END;
$$ LANGUAGE plpgsql;
SELECT checkMedianRealOdd();
checkmedianrealodd
--------------------
3800
(1 row)

SELECT checkMedianRealEven();
checkmedianrealeven
---------------------
2850
(1 row)

SELECT checkMedianDoubleOdd();
checkmediandoubleodd
----------------------
3600
(1 row)

SELECT checkMedianDoubleEven();
checkmediandoubleeven
-----------------------
2850
(1 row)

DROP FUNCTION checkMedianRealOdd();
DROP FUNCTION checkMedianRealEven();
DROP FUNCTION checkMedianDoubleOdd();
DROP FUNCTION checkMedianDoubleEven();
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
\set ECHO all
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');
ERROR: CREATE CONSTRAINT TRIGGER not supported yet
LINE 1: CREATE CONSTRAINT TRIGGER ora_alert_signal AFTER INSERT ON o...
^
HINT: See https://github.com/YugaByte/yugabyte-db/issues/1709. Click '+' on the description to raise its priority
QUERY: CREATE CONSTRAINT TRIGGER ora_alert_signal AFTER INSERT ON ora_alerts INITIALLY DEFERRED FOR EACH ROW EXECUTE PROCEDURE dbms_alert.defered_signal()
SELECT dbms_alert.signal('a2','Msg1 for a2');
ERROR: CREATE CONSTRAINT TRIGGER not supported yet
LINE 1: CREATE CONSTRAINT TRIGGER ora_alert_signal AFTER INSERT ON o...
^
HINT: See https://github.com/YugaByte/yugabyte-db/issues/1709. Click '+' on the description to raise its priority
QUERY: CREATE CONSTRAINT TRIGGER ora_alert_signal AFTER INSERT ON ora_alerts INITIALLY DEFERRED FOR EACH ROW EXECUTE PROCEDURE dbms_alert.defered_signal()
/*
* 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');
ERROR: CREATE CONSTRAINT TRIGGER not supported yet
LINE 1: CREATE CONSTRAINT TRIGGER ora_alert_signal AFTER INSERT ON o...
^
HINT: See https://github.com/YugaByte/yugabyte-db/issues/1709. Click '+' on the description to raise its priority
QUERY: CREATE CONSTRAINT TRIGGER ora_alert_signal AFTER INSERT ON ora_alerts INITIALLY DEFERRED FOR EACH ROW EXECUTE PROCEDURE dbms_alert.defered_signal()
BEGIN;
SELECT dbms_alert.signal('tds','Testing defered_signal');
ERROR: CREATE CONSTRAINT TRIGGER not supported yet
LINE 1: CREATE CONSTRAINT TRIGGER ora_alert_signal AFTER INSERT ON o...
^
HINT: See https://github.com/YugaByte/yugabyte-db/issues/1709. Click '+' on the description to raise its priority
QUERY: CREATE CONSTRAINT TRIGGER ora_alert_signal AFTER INSERT ON ora_alerts INITIALLY DEFERRED FOR EACH ROW EXECUTE PROCEDURE dbms_alert.defered_signal()
/* The signal is received while transaction is running */
SELECT dbms_alert.waitone('b1',20);
ERROR: current transaction is aborted, commands ignored until end of transaction block
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
---------
(,1)
(1 row)

SELECT dbms_alert.waitone('b2',20);
waitone
---------
(,1)
(1 row)

/* This signals a3 which is not registered in Session B */
SELECT dbms_alert.signal('a3','Msg1 for a3');
ERROR: CREATE CONSTRAINT TRIGGER not supported yet
LINE 1: CREATE CONSTRAINT TRIGGER ora_alert_signal AFTER INSERT ON o...
^
HINT: See https://github.com/YugaByte/yugabyte-db/issues/1709. Click '+' on the description to raise its priority
QUERY: CREATE CONSTRAINT TRIGGER ora_alert_signal AFTER INSERT ON ora_alerts INITIALLY DEFERRED FOR EACH ROW EXECUTE PROCEDURE dbms_alert.defered_signal()
/* alert a4 is signalled soon after a3 */
SELECT dbms_alert.signal('a4','Test- Register after signal');
ERROR: CREATE CONSTRAINT TRIGGER not supported yet
LINE 1: CREATE CONSTRAINT TRIGGER ora_alert_signal AFTER INSERT ON o...
^
HINT: See https://github.com/YugaByte/yugabyte-db/issues/1709. Click '+' on the description to raise its priority
QUERY: CREATE CONSTRAINT TRIGGER ora_alert_signal AFTER INSERT ON ora_alerts INITIALLY DEFERRED FOR EACH ROW EXECUTE PROCEDURE dbms_alert.defered_signal()
/* This signal indicates at remove() is called */
SELECT dbms_alert.waitone('b3',20);
waitone
---------
(,1)
(1 row)

/* Send signal which is removed in session B */
SELECT dbms_alert.signal('a1','Msg2 for a1');
ERROR: CREATE CONSTRAINT TRIGGER not supported yet
LINE 1: CREATE CONSTRAINT TRIGGER ora_alert_signal AFTER INSERT ON o...
^
HINT: See https://github.com/YugaByte/yugabyte-db/issues/1709. Click '+' on the description to raise its priority
QUERY: CREATE CONSTRAINT TRIGGER ora_alert_signal AFTER INSERT ON ora_alerts INITIALLY DEFERRED FOR EACH ROW EXECUTE PROCEDURE dbms_alert.defered_signal()
SELECT dbms_alert.waitone('b4',20);
waitone
---------
(,1)
(1 row)

/* Send signal which is registered in B and not removed */
SELECT dbms_alert.signal('a4','Msg1 for a4');
ERROR: CREATE CONSTRAINT TRIGGER not supported yet
LINE 1: CREATE CONSTRAINT TRIGGER ora_alert_signal AFTER INSERT ON o...
^
HINT: See https://github.com/YugaByte/yugabyte-db/issues/1709. Click '+' on the description to raise its priority
QUERY: CREATE CONSTRAINT TRIGGER ora_alert_signal AFTER INSERT ON ora_alerts INITIALLY DEFERRED FOR EACH ROW EXECUTE PROCEDURE dbms_alert.defered_signal()
/* This signal inidcates that removeall() is called */
SELECT dbms_alert.waitone('b5',20);
waitone
---------
(,1)
(1 row)

/* Send a signal to test if session B receives it after removeall() */
SELECT dbms_alert.signal('a2','Msg2 for a2');
ERROR: CREATE CONSTRAINT TRIGGER not supported yet
LINE 1: CREATE CONSTRAINT TRIGGER ora_alert_signal AFTER INSERT ON o...
^
HINT: See https://github.com/YugaByte/yugabyte-db/issues/1709. Click '+' on the description to raise its priority
QUERY: CREATE CONSTRAINT TRIGGER ora_alert_signal AFTER INSERT ON ora_alerts INITIALLY DEFERRED FOR EACH ROW EXECUTE PROCEDURE dbms_alert.defered_signal()
/* cleanup */
SELECT dbms_alert.removeall();
removeall
-----------

(1 row)
Loading

0 comments on commit 7a3c383

Please sign in to comment.