MINI MINI MANI MO

Path : /opt/oracle/product/18c/dbhomeXE/R/server/
File Upload :
Current File : //opt/oracle/product/18c/dbhomeXE/R/server/rqproc.sql

Rem
Rem Copyright (c) 2012, 2017, Oracle and/or its affiliates. 
Rem All rights reserved.
Rem
Rem    NAME
Rem      rqproc.sql - RQuery PROCedures, functions and packages
Rem
Rem    DESCRIPTION
Rem      RQuery procedures, functions and packages.
Rem
Rem    NOTES
Rem
Rem    MODIFIED   (MM/DD/YY)
Rem    qinwan      04/20/17 - XbranchMerge qinwan_bug-25832933 from
Rem                           st_oracler_1.5.0
Rem    qinwan      10/11/16 - add version to datastore object
Rem    qinwan      02/05/16 - XbranchMerge qinwan_bug-22309626 from
Rem                           st_oracler_1.5.0
Rem    qinwan      04/06/17 - Bug25832933: replace query string parameter with
Rem                           refcursor
Rem    qinwan      12/17/15 - fix sql injection issue
Rem    qinwan      08/13/15 - dspriv2: share datastore
Rem    qinwan      05/27/15 - refractorize DataStore procedure
Rem    qinwan      02/27/15 - Bug 17715960: extend datastore metadata table
Rem    ffeli       04/01/15 - Add ORE 1.5 R scripts features
Rem    paboyoun    01/29/14 - add PARALLEL_ENABLE to all single-row math
Rem                           functions
Rem    qinwan      09/09/13 - add rqDeleteRObjects
Rem    demukhin    10/26/12 - bug 14802813: init R in one place
Rem    qinwan      10/25/12 - fix bug 14808516
Rem    demukhin    10/15/12 - Created
Rem

--***************************************************************************--
--*  (*) TABLE FUNCTION: rqEval                                             *--
--***************************************************************************--

CREATE TYPE rqObject AS OBJECT (
  name  VARCHAR2(4000),
  total NUMBER,
  chunk NUMBER,
  value RAW(2000)
);
/
CREATE TYPE rqObjSet AS TABLE OF rqObject;
/

CREATE TYPE rqXMLObj AS OBJECT (
  name  VARCHAR2(4000),
  value CLOB
);
/
CREATE TYPE rqXMLSet AS TABLE OF rqXMLObj;
/

CREATE TYPE rqImgObj AS OBJECT (
  name  VARCHAR2(4000),
  id    NUMBER,
  image BLOB
);
/
CREATE TYPE rqImgSet AS TABLE OF rqImgObj;
/

---------------------------------- rqEvalImpl ---------------------------------
--
CREATE TYPE rqEvalImpl AUTHID CURRENT_USER AS OBJECT (
  typ                            SYS.AnyType,
  key                            RAW(4),

  -- ODCITableDescribe --------------------------------------------------------
  --
  STATIC FUNCTION ODCITableDescribe(
    typ1                           OUT SYS.AnyType,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER,

  STATIC FUNCTION StubTableDescribe(
    typ1                           OUT SYS.AnyType,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER,

  -- ODCITablePrepare ---------------------------------------------------------
  --
  STATIC FUNCTION ODCITablePrepare(
    sctx                           OUT rqEvalImpl,
    tf_info                        SYS.ODCITabFuncInfo,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER,

  STATIC FUNCTION StubTablePrepare(
    sctx                           OUT rqEvalImpl,
    tf_info                        SYS.ODCITabFuncInfo,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER,

  -- ODCITableStart -----------------------------------------------------------
  --
  STATIC FUNCTION ODCITableStart(
    sctx                           IN OUT rqEvalImpl,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER,

  STATIC FUNCTION StubTableStart(
    sctx                           IN OUT rqEvalImpl,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER,

  -- ODCITableFetch -----------------------------------------------------------
  --
  MEMBER FUNCTION ODCITableFetch(
    self                           IN OUT rqEvalImpl,
    nrows                          NUMBER,
    rws                            OUT SYS.AnyDataSet)
  RETURN PLS_INTEGER,

  MEMBER FUNCTION StubTableFetch(
    self                           IN OUT rqEvalImpl,
    nrows                          NUMBER,
    rws                            OUT SYS.AnyDataSet)
  RETURN PLS_INTEGER,

  -- ODCITableClose -----------------------------------------------------------
  --
  MEMBER FUNCTION ODCITableClose(
    self                           rqEvalImpl)
  RETURN PLS_INTEGER,

  MEMBER FUNCTION StubTableClose(
    self                           rqEvalImpl)
  RETURN PLS_INTEGER
);
/
SHOW ERRORS;

CREATE TYPE BODY rqEvalImpl AS

  -- ODCITableDescribe --------------------------------------------------------
  --
  STATIC FUNCTION ODCITableDescribe(
    typ1                           OUT SYS.AnyType,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER
  IS
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
    RETURN rqEvalImpl.StubTableDescribe(typ1, par_cur, out_qry, exp_nam);
  END;

  STATIC FUNCTION StubTableDescribe(
    typ1                           OUT SYS.AnyType,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER
  AS LANGUAGE C
  LIBRARY rqeLib
  NAME "rqetNilDescribe"
  WITH CONTEXT
  PARAMETERS (context, typ1, typ1 INDICATOR, par_cur, par_cur INDICATOR,
              out_qry STRING, out_qry INDICATOR, exp_nam STRING,
              exp_nam INDICATOR, RETURN INT);

  -- ODCITablePrepare ---------------------------------------------------------
  --
  STATIC FUNCTION ODCITablePrepare(
    sctx                           OUT rqEvalImpl,
    tf_info                        SYS.ODCITabFuncInfo,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER
  IS
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
    RETURN rqEvalImpl.StubTablePrepare(sctx, tf_info, par_cur, out_qry,
                                       exp_nam);
  END;

  STATIC FUNCTION StubTablePrepare(
    sctx                           OUT rqEvalImpl,
    tf_info                        SYS.ODCITabFuncInfo,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER
  AS LANGUAGE C
  LIBRARY rqeLib
  NAME "rqetNilPrepare"
  WITH CONTEXT
  PARAMETERS (context, sctx, sctx INDICATOR STRUCT,
              tf_info, tf_info INDICATOR STRUCT, par_cur, par_cur INDICATOR,
              out_qry STRING, out_qry INDICATOR, exp_nam STRING,
              exp_nam INDICATOR, RETURN INT);

  -- ODCITableStart -----------------------------------------------------------
  --
  STATIC FUNCTION ODCITableStart(
    sctx                           IN OUT rqEvalImpl,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER
  IS
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
    RETURN rqEvalImpl.StubTableStart(sctx, par_cur, out_qry, exp_nam);
  END;

  STATIC FUNCTION StubTableStart(
    sctx                           IN OUT rqEvalImpl,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER
  AS LANGUAGE C
  LIBRARY rqeLib
  NAME "rqetNilStart"
  WITH CONTEXT
  PARAMETERS (context, sctx, sctx INDICATOR STRUCT, par_cur, par_cur INDICATOR,
              out_qry STRING, out_qry INDICATOR, exp_nam STRING,
              exp_nam INDICATOR, RETURN INT);

  -- ODCITableFetch -----------------------------------------------------------
  --
  MEMBER FUNCTION ODCITableFetch(
    self                           IN OUT rqEvalImpl,
    nrows                          NUMBER,
    rws                            OUT SYS.AnyDataSet)
  RETURN PLS_INTEGER
  IS
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
    RETURN self.StubTableFetch(nrows, rws);
  END;

  MEMBER FUNCTION StubTableFetch(
    self                           IN OUT rqEvalImpl,
    nrows                          NUMBER,
    rws                            OUT SYS.AnyDataSet)
  RETURN PLS_INTEGER
  AS LANGUAGE C
  LIBRARY rqeLib
  NAME "rqetNilFetch"
  WITH CONTEXT
  PARAMETERS (context, self, self INDICATOR STRUCT, nrows,
              rws, rws INDICATOR, rws DURATION OCIDuration, RETURN INT);

  -- ODCITableClose -----------------------------------------------------------
  --
  MEMBER FUNCTION ODCITableClose(
    self                           rqEvalImpl)
  RETURN PLS_INTEGER
  IS
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
    RETURN self.StubTableClose();
  END;

  MEMBER FUNCTION StubTableClose(
    self                           rqEvalImpl)
  RETURN PLS_INTEGER
  AS LANGUAGE C
  LIBRARY rqeLib
  NAME "rqetNilClose"
  WITH CONTEXT
  PARAMETERS (context, self, self INDICATOR STRUCT, RETURN INT);

END;
/
SHOW ERRORS;

------------------------------------ rqEval -----------------------------------
--
CREATE FUNCTION rqEval(par_cur SYS_REFCURSOR, out_qry VARCHAR2,
                       exp_nam VARCHAR2)
RETURN SYS.AnyDataSet
PIPELINED USING rqEvalImpl;
/
SHOW ERRORS;

--***************************************************************************--
--*  (*) TABLE FUNCTION: rqTableEval                                        *--
--***************************************************************************--

-------------------------------- rqTableEvalImpl ------------------------------
--
CREATE TYPE rqTableEvalImpl AUTHID CURRENT_USER AS OBJECT (
  typ                            SYS.AnyType,
  key                            RAW(4),

  -- ODCITableDescribe --------------------------------------------------------
  --
  STATIC FUNCTION ODCITableDescribe(
    typ1                           OUT SYS.AnyType,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER,

  STATIC FUNCTION StubTableDescribe(
    typ1                           OUT SYS.AnyType,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER,

  -- ODCITablePrepare ---------------------------------------------------------
  --
  STATIC FUNCTION ODCITablePrepare(
    sctx                           OUT rqTableEvalImpl,
    tf_info                        SYS.ODCITabFuncInfo,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER,

  STATIC FUNCTION StubTablePrepare(
    sctx                           OUT rqTableEvalImpl,
    tf_info                        SYS.ODCITabFuncInfo,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER,

  -- ODCITableStart -----------------------------------------------------------
  --
  STATIC FUNCTION ODCITableStart(
    sctx                           IN OUT rqTableEvalImpl,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER,

  STATIC FUNCTION StubTableStart(
    sctx                           IN OUT rqTableEvalImpl,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER,

  -- ODCITableFetch -----------------------------------------------------------
  --
  MEMBER FUNCTION ODCITableFetch(
    self                           IN OUT rqTableEvalImpl,
    nrows                          NUMBER,
    rws                            OUT SYS.AnyDataSet)
  RETURN PLS_INTEGER,

  MEMBER FUNCTION StubTableFetch(
    self                           IN OUT rqTableEvalImpl,
    nrows                          NUMBER,
    rws                            OUT SYS.AnyDataSet)
  RETURN PLS_INTEGER,

  -- ODCITableClose -----------------------------------------------------------
  --
  MEMBER FUNCTION ODCITableClose(
    self                           rqTableEvalImpl)
  RETURN PLS_INTEGER,

  MEMBER FUNCTION StubTableClose(
    self                           rqTableEvalImpl)
  RETURN PLS_INTEGER
);
/
SHOW ERRORS;

CREATE TYPE BODY rqTableEvalImpl AS

  -- ODCITableDescribe --------------------------------------------------------
  --
  STATIC FUNCTION ODCITableDescribe(
    typ1                           OUT SYS.AnyType,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER
  IS
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
    RETURN rqTableEvalImpl.StubTableDescribe(typ1, inp_cur, par_cur, out_qry,
                                             exp_nam);
  END;

  STATIC FUNCTION StubTableDescribe(
    typ1                           OUT SYS.AnyType,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER
  AS LANGUAGE C
  LIBRARY rqeLib
  NAME "rqetTabDescribe"
  WITH CONTEXT
  PARAMETERS (context, typ1, typ1 INDICATOR, inp_cur, inp_cur INDICATOR,
              par_cur, par_cur INDICATOR, out_qry STRING, out_qry INDICATOR,
              exp_nam STRING, exp_nam INDICATOR, RETURN INT);

  -- ODCITablePrepare ---------------------------------------------------------
  --
  STATIC FUNCTION ODCITablePrepare(
    sctx                           OUT rqTableEvalImpl,
    tf_info                        SYS.ODCITabFuncInfo,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER
  IS
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
    RETURN rqTableEvalImpl.StubTablePrepare(sctx, tf_info, inp_cur, par_cur,
                                            out_qry, exp_nam);
  END;

  STATIC FUNCTION StubTablePrepare(
    sctx                           OUT rqTableEvalImpl,
    tf_info                        SYS.ODCITabFuncInfo,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER
  AS LANGUAGE C
  LIBRARY rqeLib
  NAME "rqetTabPrepare"
  WITH CONTEXT
  PARAMETERS (context, sctx, sctx INDICATOR STRUCT,
              tf_info, tf_info INDICATOR STRUCT, inp_cur, inp_cur INDICATOR,
              par_cur, par_cur INDICATOR, out_qry STRING, out_qry INDICATOR,
              exp_nam STRING, exp_nam INDICATOR, RETURN INT);

  -- ODCITableStart -----------------------------------------------------------
  --
  STATIC FUNCTION ODCITableStart(
    sctx                           IN OUT rqTableEvalImpl,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER
  IS
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
    RETURN rqTableEvalImpl.StubTableStart(sctx, inp_cur, par_cur, out_qry,
                                          exp_nam);
  END;

  STATIC FUNCTION StubTableStart(
    sctx                           IN OUT rqTableEvalImpl,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER
  AS LANGUAGE C
  LIBRARY rqeLib
  NAME "rqetTabStart"
  WITH CONTEXT
  PARAMETERS (context, sctx, sctx INDICATOR STRUCT, inp_cur, inp_cur INDICATOR,
              par_cur, par_cur INDICATOR, out_qry STRING, out_qry INDICATOR,
              exp_nam STRING, exp_nam INDICATOR, RETURN INT);

  -- ODCITableFetch -----------------------------------------------------------
  --
  MEMBER FUNCTION ODCITableFetch(
    self                           IN OUT rqTableEvalImpl,
    nrows                          NUMBER,
    rws                            OUT SYS.AnyDataSet)
  RETURN PLS_INTEGER
  IS
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
    RETURN self.StubTableFetch(nrows, rws);
  END;

  MEMBER FUNCTION StubTableFetch(
    self                           IN OUT rqTableEvalImpl,
    nrows                          NUMBER,
    rws                            OUT SYS.AnyDataSet)
  RETURN PLS_INTEGER
  AS LANGUAGE C
  LIBRARY rqeLib
  NAME "rqetTabFetch"
  WITH CONTEXT
  PARAMETERS (context, self, self INDICATOR STRUCT, nrows,
              rws, rws INDICATOR, rws DURATION OCIDuration, RETURN INT);

  -- ODCITableClose -----------------------------------------------------------
  --
  MEMBER FUNCTION ODCITableClose(
    self                           rqTableEvalImpl)
  RETURN PLS_INTEGER
  IS
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
    RETURN self.StubTableClose();
  END;

  MEMBER FUNCTION StubTableClose(
    self                           rqTableEvalImpl)
  RETURN PLS_INTEGER
  AS LANGUAGE C
  LIBRARY rqeLib
  NAME "rqetTabClose"
  WITH CONTEXT
  PARAMETERS (context, self, self INDICATOR STRUCT, RETURN INT);

END;
/
SHOW ERRORS;

---------------------------------- rqTableEval --------------------------------
--
CREATE FUNCTION rqTableEval(inp_cur SYS_REFCURSOR, par_cur SYS_REFCURSOR,
                            out_qry VARCHAR2, exp_nam VARCHAR2)
RETURN SYS.AnyDataSet
PIPELINED USING rqTableEvalImpl;
/
SHOW ERRORS;

--***************************************************************************--
--*  (*) TABLE FUNCTION: rqGroupEval                                        *--
--***************************************************************************--

-------------------------------- rqGroupEvalImpl ------------------------------
--
CREATE TYPE rqGroupEvalImpl AUTHID CURRENT_USER AS OBJECT (
  typ                            SYS.AnyType,
  key                            RAW(4),

  -- ODCITableDescribe --------------------------------------------------------
  --
  STATIC FUNCTION ODCITableDescribe(
    typ1                           OUT SYS.AnyType,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    grp_col                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER,

  STATIC FUNCTION StubTableDescribe(
    typ1                           OUT SYS.AnyType,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    grp_col                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER,

  -- ODCITablePrepare ---------------------------------------------------------
  --
  STATIC FUNCTION ODCITablePrepare(
    sctx                           OUT rqGroupEvalImpl,
    tf_info                        SYS.ODCITabFuncInfo,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    grp_col                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER,

  STATIC FUNCTION StubTablePrepare(
    sctx                           OUT rqGroupEvalImpl,
    tf_info                        SYS.ODCITabFuncInfo,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    grp_col                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER,

  -- ODCITableStart -----------------------------------------------------------
  --
  STATIC FUNCTION ODCITableStart(
    sctx                           IN OUT rqGroupEvalImpl,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    grp_col                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER,

  STATIC FUNCTION StubTableStart(
    sctx                           IN OUT rqGroupEvalImpl,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    grp_col                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER,

  -- ODCITableFetch -----------------------------------------------------------
  --
  MEMBER FUNCTION ODCITableFetch(
    self                           IN OUT rqGroupEvalImpl,
    nrows                          NUMBER,
    rws                            OUT SYS.AnyDataSet)
  RETURN PLS_INTEGER,

  MEMBER FUNCTION StubTableFetch(
    self                           IN OUT rqGroupEvalImpl,
    nrows                          NUMBER,
    rws                            OUT SYS.AnyDataSet)
  RETURN PLS_INTEGER,

  -- ODCITableClose -----------------------------------------------------------
  --
  MEMBER FUNCTION ODCITableClose(
    self                           rqGroupEvalImpl)
  RETURN PLS_INTEGER,

  MEMBER FUNCTION StubTableClose(
    self                           rqGroupEvalImpl)
  RETURN PLS_INTEGER
);
/
SHOW ERRORS;

CREATE TYPE BODY rqGroupEvalImpl AS

  -- ODCITableDescribe --------------------------------------------------------
  --
  STATIC FUNCTION ODCITableDescribe(
    typ1                           OUT SYS.AnyType,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    grp_col                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER
  IS
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
    RETURN rqGroupEvalImpl.StubTableDescribe(typ1, inp_cur, par_cur, out_qry,
                                             grp_col, exp_nam);
  END;

  STATIC FUNCTION StubTableDescribe(
    typ1                           OUT SYS.AnyType,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    grp_col                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER
  AS LANGUAGE C
  LIBRARY rqeLib
  NAME "rqetGrpDescribe"
  WITH CONTEXT
  PARAMETERS (context, typ1, typ1 INDICATOR, inp_cur, inp_cur INDICATOR,
              par_cur, par_cur INDICATOR, out_qry STRING, out_qry INDICATOR,
              grp_col STRING, grp_col INDICATOR, exp_nam STRING,
              exp_nam INDICATOR, RETURN INT);

  -- ODCITablePrepare ---------------------------------------------------------
  --
  STATIC FUNCTION ODCITablePrepare(
    sctx                           OUT rqGroupEvalImpl,
    tf_info                        SYS.ODCITabFuncInfo,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    grp_col                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER
  IS
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
    RETURN rqGroupEvalImpl.StubTablePrepare(sctx, tf_info, inp_cur, par_cur,
                                            out_qry, grp_col, exp_nam);
  END;

  STATIC FUNCTION StubTablePrepare(
    sctx                           OUT rqGroupEvalImpl,
    tf_info                        SYS.ODCITabFuncInfo,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    grp_col                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER
  AS LANGUAGE C
  LIBRARY rqeLib
  NAME "rqetGrpPrepare"
  WITH CONTEXT
  PARAMETERS (context, sctx, sctx INDICATOR STRUCT,
              tf_info, tf_info INDICATOR STRUCT, inp_cur, inp_cur INDICATOR,
              par_cur, par_cur INDICATOR, out_qry STRING, out_qry INDICATOR,
              grp_col STRING, grp_col INDICATOR, exp_nam STRING,
              exp_nam INDICATOR, RETURN INT);

  -- ODCITableStart -----------------------------------------------------------
  --
  STATIC FUNCTION ODCITableStart(
    sctx                           IN OUT rqGroupEvalImpl,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    grp_col                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER
  IS
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
    RETURN rqGroupEvalImpl.StubTableStart(sctx, inp_cur, par_cur, out_qry,
                                          grp_col, exp_nam);
  END;

  STATIC FUNCTION StubTableStart(
    sctx                           IN OUT rqGroupEvalImpl,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    grp_col                        VARCHAR2,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER
  AS LANGUAGE C
  LIBRARY rqeLib
  NAME "rqetGrpStart"
  WITH CONTEXT
  PARAMETERS (context, sctx, sctx INDICATOR STRUCT, inp_cur, inp_cur INDICATOR,
              par_cur, par_cur INDICATOR, out_qry STRING, out_qry INDICATOR,
              grp_col STRING, grp_col INDICATOR, exp_nam STRING,
              exp_nam INDICATOR, RETURN INT);

  -- ODCITableFetch -----------------------------------------------------------
  --
  MEMBER FUNCTION ODCITableFetch(
    self                           IN OUT rqGroupEvalImpl,
    nrows                          NUMBER,
    rws                            OUT SYS.AnyDataSet)
  RETURN PLS_INTEGER
  IS
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
    RETURN self.StubTableFetch(nrows, rws);
  END;

  MEMBER FUNCTION StubTableFetch(
    self                           IN OUT rqGroupEvalImpl,
    nrows                          NUMBER,
    rws                            OUT SYS.AnyDataSet)
  RETURN PLS_INTEGER
  AS LANGUAGE C
  LIBRARY rqeLib
  NAME "rqetGrpFetch"
  WITH CONTEXT
  PARAMETERS (context, self, self INDICATOR STRUCT, nrows,
              rws, rws INDICATOR, rws DURATION OCIDuration, RETURN INT);

  -- ODCITableClose -----------------------------------------------------------
  --
  MEMBER FUNCTION ODCITableClose(
    self                           rqGroupEvalImpl)
  RETURN PLS_INTEGER
  IS
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
    RETURN self.StubTableClose();
  END;

  MEMBER FUNCTION StubTableClose(
    self                           rqGroupEvalImpl)
  RETURN PLS_INTEGER
  AS LANGUAGE C
  LIBRARY rqeLib
  NAME "rqetGrpClose"
  WITH CONTEXT
  PARAMETERS (context, self, self INDICATOR STRUCT, RETURN INT);

END;
/
SHOW ERRORS;

--***************************************************************************--
--*  (*) TABLE FUNCTION: rqRowEval                                          *--
--***************************************************************************--

--------------------------------- rqRowEvalImpl -------------------------------
--
CREATE TYPE rqRowEvalImpl AUTHID CURRENT_USER AS OBJECT (
  typ                            SYS.AnyType,
  key                            RAW(4),

  -- ODCITableDescribe --------------------------------------------------------
  --
  STATIC FUNCTION ODCITableDescribe(
    typ1                           OUT SYS.AnyType,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    row_num                        NUMBER,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER,

  STATIC FUNCTION StubTableDescribe(
    typ1                           OUT SYS.AnyType,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    row_num                        NUMBER,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER,

  -- ODCITablePrepare ---------------------------------------------------------
  --
  STATIC FUNCTION ODCITablePrepare(
    sctx                           OUT rqRowEvalImpl,
    tf_info                        SYS.ODCITabFuncInfo,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    row_num                        NUMBER,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER,

  STATIC FUNCTION StubTablePrepare(
    sctx                           OUT rqRowEvalImpl,
    tf_info                        SYS.ODCITabFuncInfo,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    row_num                        NUMBER,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER,

  -- ODCITableStart -----------------------------------------------------------
  --
  STATIC FUNCTION ODCITableStart(
    sctx                           IN OUT rqRowEvalImpl,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    row_num                        NUMBER,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER,

  STATIC FUNCTION StubTableStart(
    sctx                           IN OUT rqRowEvalImpl,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    row_num                        NUMBER,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER,

  -- ODCITableFetch -----------------------------------------------------------
  --
  MEMBER FUNCTION ODCITableFetch(
    self                           IN OUT rqRowEvalImpl,
    nrows                          NUMBER,
    rws                            OUT SYS.AnyDataSet)
  RETURN PLS_INTEGER,

  MEMBER FUNCTION StubTableFetch(
    self                           IN OUT rqRowEvalImpl,
    nrows                          NUMBER,
    rws                            OUT SYS.AnyDataSet)
  RETURN PLS_INTEGER,

  -- ODCITableClose -----------------------------------------------------------
  --
  MEMBER FUNCTION ODCITableClose(
    self                           rqRowEvalImpl)
  RETURN PLS_INTEGER,

  MEMBER FUNCTION StubTableClose(
    self                           rqRowEvalImpl)
  RETURN PLS_INTEGER
);
/
SHOW ERRORS;

CREATE TYPE BODY rqRowEvalImpl AS

  -- ODCITableDescribe --------------------------------------------------------
  --
  STATIC FUNCTION ODCITableDescribe(
    typ1                           OUT SYS.AnyType,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    row_num                        NUMBER,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER
  IS
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
    RETURN rqRowEvalImpl.StubTableDescribe(typ1, inp_cur, par_cur, out_qry,
                                           row_num, exp_nam);
  END;

  STATIC FUNCTION StubTableDescribe(
    typ1                           OUT SYS.AnyType,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    row_num                        NUMBER,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER
  AS LANGUAGE C
  LIBRARY rqeLib
  NAME "rqetRowDescribe"
  WITH CONTEXT
  PARAMETERS (context, typ1, typ1 INDICATOR, inp_cur, inp_cur INDICATOR,
              par_cur, par_cur INDICATOR, out_qry STRING, out_qry INDICATOR,
              row_num OCINUMBER, row_num INDICATOR, exp_nam STRING,
              exp_nam INDICATOR, RETURN INT);

  -- ODCITablePrepare ---------------------------------------------------------
  --
  STATIC FUNCTION ODCITablePrepare(
    sctx                           OUT rqRowEvalImpl,
    tf_info                        SYS.ODCITabFuncInfo,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    row_num                        NUMBER,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER
  IS
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
    RETURN rqRowEvalImpl.StubTablePrepare(sctx, tf_info, inp_cur, par_cur,
                                          out_qry, row_num, exp_nam);
  END;

  STATIC FUNCTION StubTablePrepare(
    sctx                           OUT rqRowEvalImpl,
    tf_info                        SYS.ODCITabFuncInfo,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    row_num                        NUMBER,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER
  AS LANGUAGE C
  LIBRARY rqeLib
  NAME "rqetRowPrepare"
  WITH CONTEXT
  PARAMETERS (context, sctx, sctx INDICATOR STRUCT,
              tf_info, tf_info INDICATOR STRUCT, inp_cur, inp_cur INDICATOR,
              par_cur, par_cur INDICATOR, out_qry STRING, out_qry INDICATOR,
              row_num OCINUMBER, row_num INDICATOR, exp_nam STRING,
              exp_nam INDICATOR, RETURN INT);

  -- ODCITableStart -----------------------------------------------------------
  --
  STATIC FUNCTION ODCITableStart(
    sctx                           IN OUT rqRowEvalImpl,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    row_num                        NUMBER,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER
  IS
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
    RETURN rqRowEvalImpl.StubTableStart(sctx, inp_cur, par_cur, out_qry,
                                        row_num, exp_nam);
  END;

  STATIC FUNCTION StubTableStart(
    sctx                           IN OUT rqRowEvalImpl,
    inp_cur                        SYS_REFCURSOR,
    par_cur                        SYS_REFCURSOR,
    out_qry                        VARCHAR2,
    row_num                        NUMBER,
    exp_nam                        VARCHAR2)
  RETURN PLS_INTEGER
  AS LANGUAGE C
  LIBRARY rqeLib
  NAME "rqetRowStart"
  WITH CONTEXT
  PARAMETERS (context, sctx, sctx INDICATOR STRUCT, inp_cur, inp_cur INDICATOR,
              par_cur, par_cur INDICATOR, out_qry STRING, out_qry INDICATOR,
              row_num OCINUMBER, row_num INDICATOR, exp_nam STRING,
              exp_nam INDICATOR, RETURN INT);

  -- ODCITableFetch -----------------------------------------------------------
  --
  MEMBER FUNCTION ODCITableFetch(
    self                           IN OUT rqRowEvalImpl,
    nrows                          NUMBER,
    rws                            OUT SYS.AnyDataSet)
  RETURN PLS_INTEGER
  IS
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
    RETURN self.StubTableFetch(nrows, rws);
  END;

  MEMBER FUNCTION StubTableFetch(
    self                           IN OUT rqRowEvalImpl,
    nrows                          NUMBER,
    rws                            OUT SYS.AnyDataSet)
  RETURN PLS_INTEGER
  AS LANGUAGE C
  LIBRARY rqeLib
  NAME "rqetRowFetch"
  WITH CONTEXT
  PARAMETERS (context, self, self INDICATOR STRUCT, nrows,
              rws, rws INDICATOR, rws DURATION OCIDuration, RETURN INT);

  -- ODCITableClose -----------------------------------------------------------
  --
  MEMBER FUNCTION ODCITableClose(
    self                           rqRowEvalImpl)
  RETURN PLS_INTEGER
  IS
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
    RETURN self.StubTableClose();
  END;

  MEMBER FUNCTION StubTableClose(
    self                           rqRowEvalImpl)
  RETURN PLS_INTEGER
  AS LANGUAGE C
  LIBRARY rqeLib
  NAME "rqetRowClose"
  WITH CONTEXT
  PARAMETERS (context, self, self INDICATOR STRUCT, RETURN INT);

END;
/
SHOW ERRORS;

----------------------------------- rqRowEval ---------------------------------
--
CREATE FUNCTION rqRowEval(inp_cur SYS_REFCURSOR, par_cur SYS_REFCURSOR,
                          out_qry VARCHAR2, row_num NUMBER, exp_nam VARCHAR2)
RETURN SYS.AnyDataSet
PIPELINED PARALLEL_ENABLE (PARTITION inp_cur BY ANY) USING rqRowEvalImpl;
/
SHOW ERRORS;

--***************************************************************************--
--*  (*) TABLE FUNCTION: rqCrossprod                                        *--
--***************************************************************************--

CREATE TYPE rqNumericElt AS OBJECT (
  name NUMBER, 
  val  NUMBER
);
/
CREATE TYPE rqNumericEltSet AS TABLE OF rqNumericElt;
/

-------------------------------- rqCrossprodImpl ------------------------------
--
CREATE TYPE rqCrossprodImpl AS OBJECT (
  key                            RAW(4),

  -- ODCITableStart -----------------------------------------------------------
  --
  STATIC FUNCTION ODCITableStart(sctx    OUT    rqCrossprodImpl,
                                 p_cur          SYS_REFCURSOR,
                                 p_ncolb        PLS_INTEGER)
  RETURN PLS_INTEGER
  AS LANGUAGE C
  LIBRARY rq$lib
  NAME "rqCrossprodTableStart"
  WITH CONTEXT
  PARAMETERS (context, sctx, sctx INDICATOR STRUCT, p_cur, p_ncolb,
              RETURN INT),

  -- ODCITableFetch -----------------------------------------------------------
  --
  MEMBER FUNCTION ODCITableFetch(self    IN OUT rqCrossprodImpl,
                                 nrows          NUMBER,
                                 rws     OUT    rqNumericEltSet)
  RETURN PLS_INTEGER
  AS LANGUAGE C
  LIBRARY rq$lib
  NAME "rqCrossprodTableFetch"
  WITH CONTEXT
  PARAMETERS (context, self, self INDICATOR STRUCT, nrows,
              rws, rws INDICATOR, RETURN INT),

  -- ODCITableClose -----------------------------------------------------------
  --
  MEMBER FUNCTION ODCITableClose(self           rqCrossprodImpl)
  RETURN PLS_INTEGER
  AS LANGUAGE C
  LIBRARY rq$lib
  NAME "rqCrossprodTableClose"
  WITH CONTEXT
  PARAMETERS (context, self, self INDICATOR STRUCT, RETURN INT)
);
/
SHOW ERRORS;

------------------------------- rqCrossprod -----------------------------------
--
CREATE FUNCTION rqCrossprod(p_cur SYS_REFCURSOR, p_ncolb PLS_INTEGER)
RETURN rqNumericEltSet
PIPELINED PARALLEL_ENABLE (PARTITION p_cur BY ANY) USING rqCrossprodImpl;
/
SHOW ERRORS;

--***************************************************************************--
--*  (*) TABLE FUNCTION: rqStepwise                                         *--
--***************************************************************************--

CREATE TYPE rqStepwiseType AS OBJECT (
    layer         NUMBER,
    name          NUMBER,
    estimate      NUMBER,
    column_ok     NUMBER,
    std_error     NUMBER,
    t_value       NUMBER,
    prob_t        NUMBER
);
/
CREATE TYPE rqStepwiseTypeSet AS TABLE OF rqStepwiseType;
/

-------------------------------- rqStepwiseImpl -------------------------------
--
CREATE TYPE rqStepwiseImpl AUTHID CURRENT_USER AS OBJECT (
    key RAW(4),

    STATIC FUNCTION ODCITableStart(
        sctx            OUT RqStepwiseImpl,
        cur             SYS_REFCURSOR,
        colStatus       VARCHAR2,
        maxSteps        PLS_INTEGER,
        direction       PLS_INTEGER,
        bestKModels     PLS_INTEGER,
        enterThreshold  DOUBLE PRECISION,
        leaveThreshold  DOUBLE PRECISION)
    RETURN PLS_INTEGER
    AS LANGUAGE C
    LIBRARY rq$lib
    NAME "rqStepwiseTableStart"
    WITH CONTEXT
    PARAMETERS (context, sctx, sctx INDICATOR STRUCT, cur, colStatus, maxSteps,
        direction, bestKModels, enterThreshold, leaveThreshold, RETURN INT),

    MEMBER FUNCTION ODCITableFetch(
        self            IN OUT RqStepwiseImpl,
        nrows           NUMBER,
        outSet          OUT RqStepwiseTypeSet)
    RETURN PLS_INTEGER
    AS LANGUAGE C
    LIBRARY rq$lib
    NAME "rqStepwiseTableFetch"
    WITH CONTEXT
    PARAMETERS (context, self, self INDICATOR STRUCT, nrows, outSet, outSet
        INDICATOR, RETURN INT),

    MEMBER FUNCTION ODCITableClose(self IN RqStepwiseImpl)
    RETURN PLS_INTEGER
    AS LANGUAGE C
    LIBRARY rq$lib
    NAME "rqStepwiseTableClose"
    WITH CONTEXT
    PARAMETERS (context, self, self INDICATOR STRUCT, RETURN INT)
);
/
SHOW ERRORS

-------------------------------- rqStepwise -----------------------------------
--
CREATE FUNCTION rqStepwise(
    cur                 SYS_REFCURSOR,
    colStatus           VARCHAR2,
    maxSteps            PLS_INTEGER,
    direction           PLS_INTEGER,
    bestKModels         PLS_INTEGER,
    enterThreshold      DOUBLE PRECISION,
    leaveThreshold      DOUBLE PRECISION)
RETURN RqStepwiseTypeSet
PIPELINED USING rqStepwiseImpl;
/
SHOW ERRORS;

--***************************************************************************--
-- Neural Network package                                                   *--
--***************************************************************************--
CREATE TYPE rqNeuralType AS OBJECT (
    key     NUMBER,
    value   NUMBER
);
/
SHOW ERRORS;

CREATE TYPE rqNeuralTypeSet AS TABLE OF rqNeuralType;
/
SHOW ERRORS;

CREATE TYPE rqNeuralImpl AUTHID CURRENT_USER AS OBJECT (
    key RAW(4),

    STATIC FUNCTION ODCITableStart(
        sctx            OUT RqNeuralImpl,
        cur             SYS_REFCURSOR,
        actEnum         VARCHAR2,
        nNodes          VARCHAR2,
        gradTolerance   DOUBLE PRECISION,
        seed            PLS_INTEGER,
        lowerBound      DOUBLE PRECISION,
        upperBound      DOUBLE PRECISION,
        maxIterations   PLS_INTEGER,
        maxRows         PLS_INTEGER,
        probability     DOUBLE PRECISION,
        nUpdates        PLS_INTEGER,
        nInputNodes     PLS_INTEGER,
        nLayers         PLS_INTEGER,
        nThreads        PLS_INTEGER,
        scaleHessian    PLS_INTEGER,
        solver          PLS_INTEGER)
    RETURN PLS_INTEGER
    AS LANGUAGE C
    LIBRARY rq$lib
    NAME "rqNeuralTableStart"
    WITH CONTEXT
    PARAMETERS (context, sctx, sctx INDICATOR STRUCT, cur, actEnum, nNodes,
        gradTolerance, seed, lowerBound, upperBound, maxIterations, maxRows,
        probability, nUpdates, nInputNodes, nLayers, nThreads, scaleHessian,
        solver, RETURN INT),
    MEMBER FUNCTION ODCITableFetch(
        self            IN OUT RqNeuralImpl,
        nrows           NUMBER,
        outSet          OUT RqNeuralTypeSet)
    RETURN PLS_INTEGER
    AS LANGUAGE C
    LIBRARY rq$lib
    NAME "rqNeuralTableFetch"
    WITH CONTEXT
    PARAMETERS (context, self, self INDICATOR STRUCT, nrows, outSet, outSet
        INDICATOR, RETURN INT),

    MEMBER FUNCTION ODCITableClose(self IN RqNeuralImpl)
    RETURN PLS_INTEGER
    AS LANGUAGE C
    LIBRARY rq$lib
    NAME "rqNeuralTableClose"
    WITH CONTEXT
    PARAMETERS (context, self, self INDICATOR STRUCT, RETURN INT)
);
/
SHOW ERRORS

CREATE FUNCTION rqNeural(
    cur             SYS_REFCURSOR,
    actEnum         VARCHAR2,
    nNodes          VARCHAR2,
    gradTolerance   DOUBLE PRECISION,
    seed            PLS_INTEGER,
    lowerBound      DOUBLE PRECISION,
    upperBound      DOUBLE PRECISION,
    maxIterations   PLS_INTEGER,
    maxRows         PLS_INTEGER,
    probability     DOUBLE PRECISION,
    nUpdates        PLS_INTEGER,
    nInputNodes     PLS_INTEGER,
    nLayers         PLS_INTEGER,
    nThreads        PLS_INTEGER,
    scaleHessian    PLS_INTEGER,
    solver          PLS_INTEGER)
RETURN RqNeuralTypeSet
PIPELINED USING rqNeuralImpl;
/
SHOW ERRORS;
--***************************************************************************--

--***************************************************************************--
--*  (*) TABLE FUNCTION: rqUnlistTable                                      *--
--***************************************************************************--

CREATE FUNCTION rqUnlistTable(
  refcur    IN  SYS_REFCURSOR,
  nrow      IN  PLS_INTEGER,             -- matrix e1 number of rows
  ncol      IN  PLS_INTEGER,             -- matrix e1 number of columns
  maxfetch  IN  PLS_INTEGER DEFAULT 500  -- max number of rows to bulk fetch
)
RETURN rqNumericEltSet
PIPELINED
AUTHID CURRENT_USER
IS
  l_cur       SYS_REFCURSOR := refcur;
  vcursor     PLS_INTEGER;                -- cursor
  numtab      DBMS_SQL.NUMBER_TABLE;      -- number table
  totfetch    PLS_INTEGER;                -- total number of rows fetched
  nfetch      PLS_INTEGER;                -- number of rows fetched
  fetchlim    PLS_INTEGER;                -- max number of rows to bulk fetch
  idx         PLS_INTEGER;                -- array index
  rowout      rqNumericElt := rqNumericElt(NULL, NULL);
BEGIN
  IF (nrow < maxfetch) THEN
    fetchlim := nrow;
  ELSE
    fetchlim := maxfetch;
  END IF;

  -- Use DBMS_SQL for reading data
  -- Convert cursor to DBMS_SQL cursor Id
  vcursor := DBMS_SQL.TO_CURSOR_NUMBER(l_cur);

  -- Define array types for each column
  FOR j IN 1..ncol LOOP
    DBMS_SQL.DEFINE_ARRAY(vcursor, j, numtab, fetchlim, 1);
  END LOOP;

  totfetch := 0;
  LOOP
    nfetch := DBMS_SQL.FETCH_ROWS(vcursor);
    EXIT WHEN nfetch = 0;
    FOR j in 1..ncol LOOP
      DBMS_SQL.COLUMN_VALUE(vcursor, j, numtab);
      FOR i in 1..nfetch LOOP
        idx := i + totfetch;
        rowout.name := idx + (j - 1) * nrow;
        rowout.val  := numtab(idx);
        PIPE ROW(rowout);
      END LOOP;
    END LOOP;
    totfetch := totfetch + nfetch;
    EXIT WHEN totfetch = nrow;
  END LOOP;

  -- Close cursor
  DBMS_SQL.CLOSE_CURSOR(vcursor);

  RETURN;

EXCEPTION WHEN OTHERS THEN
  -- Close cursor, if open
  IF DBMS_SQL.IS_OPEN(vcursor) THEN
    DBMS_SQL.CLOSE_CURSOR(vcursor);
  END IF;
  RAISE;
  RETURN;

END rqUnlistTable;
/
SHOW ERRORS;

--***************************************************************************--
--*  (*) FUNCTIONS: rqRFuncEval family                                      *--
--***************************************************************************--

CREATE TYPE RQ_ELEM_T AS OBJECT (
  NAME    VARCHAR2(4000), 
  NUMVAL  BINARY_DOUBLE,
  STRVAL  VARCHAR2(4000)
);
/
CREATE TYPE RQ_PARAM_T AS TABLE OF RQ_ELEM_T;
/
                  
-------------------------------- rqRFuncEvalNum -------------------------------
--
CREATE FUNCTION rqRFuncEvalNum(exp_nam VARCHAR2, paramlst RQ_PARAM_T)
RETURN BINARY_DOUBLE 
AUTHID CURRENT_USER
AS LANGUAGE C
LIBRARY rqeLib
NAME "rqFuncEvalReal"
WITH CONTEXT
PARAMETERS (context, exp_nam, exp_nam INDICATOR, paramlst, paramlst INDICATOR,
            RETURN BY REFERENCE);
/
SHOW ERRORS

-------------------------------- rqRFuncEvalChr -------------------------------
--
CREATE FUNCTION rqRFuncEvalChr(exp_nam VARCHAR2, paramlst RQ_PARAM_T)
RETURN VARCHAR2
AUTHID CURRENT_USER 
AS LANGUAGE C
LIBRARY rqeLib
NAME "rqFuncEvalStr"
WITH CONTEXT
PARAMETERS (context, exp_nam, exp_nam INDICATOR, paramlst, paramlst INDICATOR);
/
SHOW ERRORS

--***************************************************************************--
--*  (*) FUNCTIONS: Math                                                    *--
--***************************************************************************--

---------------------------------- rqBesselI ----------------------------------
--
CREATE FUNCTION rqBesselI(
  x    DOUBLE PRECISION,
  nu   DOUBLE PRECISION,
  exp  DOUBLE PRECISION)
RETURN DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rqeLib
NAME "rqefBesselI"
WITH CONTEXT
PARAMETERS (CONTEXT, x DOUBLE, x INDICATOR SHORT, nu DOUBLE,
            nu INDICATOR SHORT, exp DOUBLE, exp INDICATOR SHORT,
            RETURN INDICATOR BY REFERENCE SHORT, RETURN DOUBLE);
/
SHOW ERRORS;

---------------------------------- rqBesselK ----------------------------------
--
CREATE FUNCTION rqBesselK(
  x    DOUBLE PRECISION,
  nu   DOUBLE PRECISION,
  exp  DOUBLE PRECISION)
RETURN DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rqeLib
NAME "rqefBesselK"
WITH CONTEXT
PARAMETERS (CONTEXT, x DOUBLE, x INDICATOR SHORT, nu DOUBLE,
            nu INDICATOR SHORT, exp DOUBLE, exp INDICATOR SHORT,
            RETURN INDICATOR BY REFERENCE SHORT, RETURN DOUBLE);
/
SHOW ERRORS;

---------------------------------- rqBesselJ ----------------------------------
--
CREATE FUNCTION rqBesselJ(
  x   DOUBLE PRECISION,
  nu  DOUBLE PRECISION)
RETURN DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rqeLib
NAME "rqefBesselJ"
WITH CONTEXT
PARAMETERS (CONTEXT, x DOUBLE, x INDICATOR SHORT, nu DOUBLE,
            nu INDICATOR SHORT, RETURN INDICATOR BY REFERENCE SHORT,
            RETURN DOUBLE);
/
SHOW ERRORS;

---------------------------------- rqBesselY ----------------------------------
--
CREATE FUNCTION rqBesselY(
  x   DOUBLE PRECISION,
  nu  DOUBLE PRECISION)
RETURN DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rqeLib
NAME "rqefBesselY"
WITH CONTEXT
PARAMETERS (CONTEXT, x DOUBLE, x INDICATOR SHORT, nu DOUBLE,
            nu INDICATOR SHORT, RETURN INDICATOR BY REFERENCE SHORT,
            RETURN DOUBLE);
/
SHOW ERRORS;

----------------------------------- rqGamma -----------------------------------
--
CREATE FUNCTION rqGamma(
    x       DOUBLE PRECISION)
RETURN      DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_gamma"
PARAMETERS (
    x       DOUBLE,
    x       INDICATOR SHORT,
    RETURN  INDICATOR SHORT,
    RETURN  DOUBLE);
/
SHOW ERRORS;

----------------------------------- rqLgamma ----------------------------------
--
CREATE FUNCTION rqLgamma(
    x       DOUBLE PRECISION)
RETURN      DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_lgamma"
PARAMETERS (
    x       DOUBLE,
    x       INDICATOR SHORT,
    RETURN  INDICATOR SHORT,
    RETURN  DOUBLE);
/
SHOW ERRORS;

----------------------------------- rqDigamma ---------------------------------
--
CREATE FUNCTION rqDigamma(
    x       DOUBLE PRECISION)
RETURN      DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_digamma"
PARAMETERS (
    x       DOUBLE,
    x       INDICATOR SHORT,
    RETURN  INDICATOR SHORT,
    RETURN  DOUBLE);
/
SHOW ERRORS;

---------------------------------- rqTrigamma ---------------------------------
--
CREATE FUNCTION rqTrigamma(
    x       DOUBLE PRECISION)
RETURN      DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_trigamma"
PARAMETERS (
    x       DOUBLE,
    x       INDICATOR SHORT,
    RETURN  INDICATOR SHORT,
    RETURN  DOUBLE);
/
SHOW ERRORS;

------------------------------------ rqErf ------------------------------------
--
CREATE FUNCTION rqErf(
    x       DOUBLE PRECISION)
RETURN      DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_erf"
PARAMETERS (
    x       DOUBLE,
    x       INDICATOR SHORT,
    RETURN  INDICATOR SHORT,
    RETURN  DOUBLE);
/
SHOW ERRORS;

------------------------------------ rqErfc -----------------------------------
--
CREATE FUNCTION rqErfc(
    x       DOUBLE PRECISION)
RETURN      DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_erfc"
PARAMETERS (
    x       DOUBLE,
    x       INDICATOR SHORT,
    RETURN  INDICATOR SHORT,
    RETURN  DOUBLE);
/
SHOW ERRORS;

------------------------------------ rqDbeta ----------------------------------
--
CREATE FUNCTION rqDbeta(
    a           DOUBLE PRECISION,
    b           DOUBLE PRECISION,
    ncp         DOUBLE PRECISION,
    logP        PLS_INTEGER,
    x           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_pdf_beta"
PARAMETERS (
    a           DOUBLE,
    a           INDICATOR SHORT,
    b           DOUBLE,
    b           INDICATOR SHORT,
    ncp         DOUBLE,
    ncp         INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    x           DOUBLE,
    x           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;
----------------------------------- rqPbeta -----------------------------------
--
CREATE FUNCTION rqPbeta(
    a           DOUBLE PRECISION,
    b           DOUBLE PRECISION,
    ncp         DOUBLE PRECISION,
    lowerTail   PLS_INTEGER,
    logP        PLS_INTEGER,
    x           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_prob_beta"
PARAMETERS (
    a           DOUBLE,
    a           INDICATOR SHORT,
    b           DOUBLE,
    b           INDICATOR SHORT,
    ncp         DOUBLE,
    ncp         INDICATOR SHORT,
    lowerTail   INT,
    lowerTail   INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    x           DOUBLE,
    x           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

----------------------------------- rqQbeta -----------------------------------
--
CREATE FUNCTION rqQbeta(
    a           DOUBLE PRECISION,
    b           DOUBLE PRECISION,
    ncp         DOUBLE PRECISION,
    lowerTail   PLS_INTEGER,
    logP        PLS_INTEGER,
    x           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_quantile_beta"
PARAMETERS (
    a           DOUBLE,
    a           INDICATOR SHORT,
    b           DOUBLE,
    b           INDICATOR SHORT,
    ncp         DOUBLE,
    ncp         INDICATOR SHORT,
    lowerTail   INT,
    lowerTail   INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    x           DOUBLE,
    x           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

----------------------------------- rqDbinom ----------------------------------
--
CREATE FUNCTION rqDbinom(
    n           DOUBLE PRECISION,
    prob        DOUBLE PRECISION,
    logP        PLS_INTEGER,
    k           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_pdf_binomial"
PARAMETERS (
    n           DOUBLE,
    n           INDICATOR SHORT,
    prob        DOUBLE,
    prob        INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    k           DOUBLE,
    k           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

----------------------------------- rqPbinom ----------------------------------
--
CREATE FUNCTION rqPbinom(
    n           DOUBLE PRECISION,
    prob        DOUBLE PRECISION,
    lowerTail   PLS_INTEGER,
    logP        PLS_INTEGER,
    k           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_prob_binomial"
PARAMETERS (
    n           DOUBLE,
    n           INDICATOR SHORT,
    prob        DOUBLE,
    prob        INDICATOR SHORT,
    lowerTail   INT,
    lowerTail   INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    k           DOUBLE,
    k           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

----------------------------------- rqQbinom ----------------------------------
--
CREATE FUNCTION rqQbinom(
    n           DOUBLE PRECISION,
    prob        DOUBLE PRECISION,
    lowerTail   PLS_INTEGER,
    logP        PLS_INTEGER,
    p           DOUBLE PRECISION)
RETURN      DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_quantile_binomial"
PARAMETERS (
    n           DOUBLE,
    n           INDICATOR SHORT,
    prob        DOUBLE,
    prob        INDICATOR SHORT,
    lowerTail   INT,
    lowerTail   INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    p           DOUBLE,
    p           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

---------------------------------- rqQcauchy ----------------------------------
--
CREATE FUNCTION rqQcauchy(
    x       DOUBLE PRECISION,
    loc     DOUBLE PRECISION,
    scale   DOUBLE PRECISION)
RETURN      DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_quantile_cauchy"
PARAMETERS (
    x       DOUBLE,
    x       INDICATOR SHORT,
    loc     DOUBLE,
    loc     INDICATOR SHORT,
    scale   DOUBLE,
    scale   INDICATOR SHORT,
    RETURN  INDICATOR SHORT,
    RETURN  DOUBLE);
/
SHOW ERRORS;

---------------------------------- rqPcauchy ----------------------------------
--
CREATE FUNCTION rqPcauchy(
    x       DOUBLE PRECISION,
    loc     DOUBLE PRECISION,
    scale   DOUBLE PRECISION)
RETURN      DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_prob_cauchy"
PARAMETERS (
    x       DOUBLE,
    x       INDICATOR SHORT,
    loc     DOUBLE,
    loc     INDICATOR SHORT,
    scale   DOUBLE,
    scale   INDICATOR SHORT,
    RETURN  INDICATOR SHORT,
    RETURN  DOUBLE);
/
SHOW ERRORS;

----------------------------------- rqDchisq ----------------------------------
--
CREATE FUNCTION rqDchisq(
    df          DOUBLE PRECISION,
    ncp         DOUBLE PRECISION,
    logP        PLS_INTEGER,
    x           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_pdf_chi_square"
PARAMETERS (
    df          DOUBLE,
    df          INDICATOR SHORT,
    ncp         DOUBLE,
    ncp         INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    x           DOUBLE,
    x           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

----------------------------------- rqPchisq ----------------------------------
--
CREATE FUNCTION rqPchisq(
    df          DOUBLE PRECISION,
    ncp         DOUBLE PRECISION,
    lowerTail   PLS_INTEGER,
    logP        PLS_INTEGER,
    x           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_prob_chi_square"
PARAMETERS (
    df          DOUBLE,
    df          INDICATOR SHORT,
    ncp         DOUBLE,
    ncp         INDICATOR SHORT,
    lowerTail   INT,
    lowerTail   INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    x           DOUBLE,
    x           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

----------------------------------- rqQchisq ----------------------------------
--
CREATE FUNCTION rqQchisq(
    df          DOUBLE PRECISION,
    ncp         DOUBLE PRECISION,
    lowerTail   PLS_INTEGER,
    logP        PLS_INTEGER,
    x           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_quantile_chi_square"
PARAMETERS (
    df          DOUBLE,
    df          INDICATOR SHORT,
    ncp         DOUBLE,
    ncp         INDICATOR SHORT,
    lowerTail   INT,
    lowerTail   INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    x           DOUBLE,
    x           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

------------------------------------ rqPexp -----------------------------------
--
CREATE FUNCTION rqPexp(
    lambda  DOUBLE PRECISION,
    x       DOUBLE PRECISION)
RETURN      DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_prob_exponential"
PARAMETERS (
    lambda  DOUBLE,
    lambda  INDICATOR SHORT,
    x       DOUBLE,
    x       INDICATOR SHORT,
    RETURN  INDICATOR SHORT,
    RETURN  DOUBLE);
/
SHOW ERRORS;

------------------------------------ rqQexp -----------------------------------
--
CREATE FUNCTION rqQexp(
    lambda  DOUBLE PRECISION,
    x       DOUBLE PRECISION)
RETURN      DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_quantile_exponential"
PARAMETERS (
    lambda  DOUBLE,
    lambda  INDICATOR SHORT,
    x       DOUBLE,
    x       INDICATOR SHORT,
    RETURN  INDICATOR SHORT,
    RETURN  DOUBLE);
/
SHOW ERRORS;

------------------------------------- rqDf ------------------------------------
--
CREATE FUNCTION rqDf(
    df1         DOUBLE PRECISION,
    df2         DOUBLE PRECISION,
    ncp         DOUBLE PRECISION,
    logP        PLS_INTEGER,
    x           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_pdf_f"
PARAMETERS (
    df1         DOUBLE,
    df1         INDICATOR SHORT,
    df2         DOUBLE,
    df2         INDICATOR SHORT,
    ncp         DOUBLE,
    ncp         INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    x           DOUBLE,
    x           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

------------------------------------- rqPf ------------------------------------
--
CREATE FUNCTION rqPf(
    df1         DOUBLE PRECISION,
    df2         DOUBLE PRECISION,
    ncp         DOUBLE PRECISION,
    lowerTail   PLS_INTEGER,
    logP        PLS_INTEGER,
    x           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_prob_f"
PARAMETERS (
    df1         DOUBLE,
    df1         INDICATOR SHORT,
    df2         DOUBLE,
    df2         INDICATOR SHORT,
    ncp         DOUBLE,
    ncp         INDICATOR SHORT,
    lowerTail   INT,
    lowerTail   INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    x           DOUBLE,
    x           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

------------------------------------ rqQf -------------------------------------
--
CREATE FUNCTION rqQf(
    df1         DOUBLE PRECISION,
    df2         DOUBLE PRECISION,
    ncp         DOUBLE PRECISION,
    lowerTail   PLS_INTEGER,
    logP        PLS_INTEGER,
    x           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_quantile_f"
PARAMETERS (
    df1         DOUBLE,
    df1         INDICATOR SHORT,
    df2         DOUBLE,
    df2         INDICATOR SHORT,
    ncp         DOUBLE,
    ncp         INDICATOR SHORT,
    lowerTail   INT,
    lowerTail   INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    x           DOUBLE,
    x           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

----------------------------------- rqDgamma ----------------------------------
--
CREATE FUNCTION rqDgamma(
    a           DOUBLE PRECISION,
    b           DOUBLE PRECISION,
    logP        PLS_INTEGER,
    x           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_pdf_gamma"
PARAMETERS (
    a           DOUBLE,
    a           INDICATOR SHORT,
    b           DOUBLE,
    b           INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    x           DOUBLE,
    x           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

----------------------------------- rqQgamma ----------------------------------
--
CREATE FUNCTION rqQgamma(
    a           DOUBLE PRECISION,
    b           DOUBLE PRECISION,
    lowerTail   PLS_INTEGER,
    logP        PLS_INTEGER,
    x           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_quantile_gamma"
PARAMETERS (
    a           DOUBLE,
    a           INDICATOR SHORT,
    b           DOUBLE,
    b           INDICATOR SHORT,
    lowerTail   INT,
    lowerTail   INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    x           DOUBLE,
    x           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

----------------------------------- rqPgamma ----------------------------------
--
CREATE FUNCTION rqPgamma(
    a           DOUBLE PRECISION,
    b           DOUBLE PRECISION,
    lowerTail   PLS_INTEGER,
    logP        PLS_INTEGER,
    x           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_prob_gamma"
PARAMETERS (
    a           DOUBLE,
    a           INDICATOR SHORT,
    b           DOUBLE,
    b           INDICATOR SHORT,
    lowerTail   INT,
    lowerTail   INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    x           DOUBLE,
    x           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

----------------------------------- rqDnbinom ---------------------------------
--
CREATE FUNCTION rqDnbinom(
    n           DOUBLE PRECISION,
    prob        DOUBLE PRECISION,
    logP        PLS_INTEGER,
    x           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_pdf_nbinom"
PARAMETERS (
    n           DOUBLE,
    n           INDICATOR SHORT,
    prob        DOUBLE,
    prob        INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    x           DOUBLE,
    x           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

----------------------------------- rqPnbinom ---------------------------------
--
CREATE FUNCTION rqPnbinom(
    n           DOUBLE PRECISION,
    prob        DOUBLE PRECISION,
    lowerTail   PLS_INTEGER,
    logP        PLS_INTEGER,
    x           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_prob_nbinom"
PARAMETERS (
    n           DOUBLE,
    n           INDICATOR SHORT,
    prob        DOUBLE,
    prob        INDICATOR SHORT,
    lowerTail   INT,
    lowerTail   INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    x           DOUBLE,
    x           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

----------------------------------- rqQnbinom ---------------------------------
--
CREATE FUNCTION rqQnbinom(
    n           DOUBLE PRECISION,
    prob        DOUBLE PRECISION,
    lowerTail   PLS_INTEGER,
    logP        PLS_INTEGER,
    x           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_quantile_nbinom"
PARAMETERS (
    n           DOUBLE,
    n           INDICATOR SHORT,
    prob        DOUBLE,
    prob        INDICATOR SHORT,
    lowerTail   INT,
    lowerTail   INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    x           DOUBLE,
    x           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

----------------------------------- rqPnorm -----------------------------------
--
CREATE FUNCTION rqPnorm(
    x       DOUBLE PRECISION)
RETURN      DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_prob_normal"
PARAMETERS (
    x       DOUBLE,
    x       INDICATOR SHORT,
    RETURN  INDICATOR SHORT,
    RETURN  DOUBLE);
/
SHOW ERRORS;

----------------------------------- rqQnorm -----------------------------------
--
CREATE FUNCTION rqQnorm(
    x       DOUBLE PRECISION)
RETURN      DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_quantile_normal"
PARAMETERS (
    x       DOUBLE,
    x       INDICATOR SHORT,
    RETURN  INDICATOR SHORT,
    RETURN  DOUBLE);
/
SHOW ERRORS;

------------------------------------ rqDpois ----------------------------------
--
CREATE FUNCTION rqDpois(
    lambda      DOUBLE PRECISION,
    logP        PLS_INTEGER,
    x           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_pdf_poisson"
PARAMETERS (
    lambda      DOUBLE,
    lambda      INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    x           DOUBLE,
    x           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

----------------------------------- rqPpois -----------------------------------
--
CREATE FUNCTION rqPpois(
    lambda      DOUBLE PRECISION,
    lowerTail   PLS_INTEGER,
    logP        PLS_INTEGER,
    x           PLS_INTEGER)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_prob_poisson"
PARAMETERS (
    lambda      DOUBLE,
    lambda      INDICATOR SHORT,
    lowerTail   INT,
    lowerTail   INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    x           INT,
    x           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

------------------------------------ rqQpois ----------------------------------
--
CREATE FUNCTION rqQpois(
    lambda      DOUBLE PRECISION,
    lowerTail   PLS_INTEGER,
    logP        PLS_INTEGER,
    x           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_quantile_poisson"
PARAMETERS (
    lambda      DOUBLE,
    lambda      INDICATOR SHORT,
    lowerTail   INT,
    lowerTail   INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    x           DOUBLE,
    x           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

------------------------------------- rqQt ------------------------------------
--
CREATE FUNCTION rqQt(
    df          DOUBLE PRECISION,
    ncp         DOUBLE PRECISION,
    lowerTail   PLS_INTEGER,
    logP        PLS_INTEGER,
    x           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_quantile_student"
PARAMETERS (
    df          DOUBLE,
    df          INDICATOR SHORT,
    ncp         DOUBLE,
    ncp         INDICATOR SHORT,
    lowerTail   INT,
    lowerTail   INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    x           DOUBLE,
    x           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

------------------------------------- rqPt ------------------------------------
--
CREATE FUNCTION rqPt(
    df          DOUBLE PRECISION,
    ncp         DOUBLE PRECISION,
    lowerTail   PLS_INTEGER,
    logP        PLS_INTEGER,
    x           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_prob_student"
PARAMETERS (
    df          DOUBLE,
    df          INDICATOR SHORT,
    ncp         DOUBLE,
    ncp         INDICATOR SHORT,
    lowerTail   INT,
    lowerTail   INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    x           DOUBLE,
    x           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

---------------------------------- rqPweibull ---------------------------------
--
CREATE FUNCTION rqPweibull(
    shape   DOUBLE PRECISION,
    scale   DOUBLE PRECISION,
    x       DOUBLE PRECISION)
RETURN      DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_prob_weibull"
PARAMETERS (
    shape   DOUBLE,
    shape   INDICATOR SHORT,
    scale   DOUBLE,
    scale   INDICATOR SHORT,
    x       DOUBLE,
    x       INDICATOR SHORT,
    RETURN  INDICATOR SHORT,
    RETURN  DOUBLE);
/
SHOW ERRORS;

---------------------------------- rqQweibull ---------------------------------
--
CREATE FUNCTION rqQweibull(
    shape   DOUBLE PRECISION,
    scale   DOUBLE PRECISION,
    x       DOUBLE PRECISION)
RETURN      DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_quantile_weibull"
PARAMETERS (
    shape   DOUBLE,
    shape   INDICATOR SHORT,
    scale   DOUBLE,
    scale   INDICATOR SHORT,
    x       DOUBLE,
    x       INDICATOR SHORT,
    RETURN  INDICATOR SHORT,
    RETURN  DOUBLE);
/
SHOW ERRORS;

---------------------------------- rqDweibull ---------------------------------
--
CREATE FUNCTION rqDweibull(
    shape   DOUBLE PRECISION,
    scale   DOUBLE PRECISION,
    x       DOUBLE PRECISION)
RETURN      DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_pdf_weibull"
PARAMETERS (
    shape   DOUBLE,
    shape   INDICATOR SHORT,
    scale   DOUBLE,
    scale   INDICATOR SHORT,
    x       DOUBLE,
    x       INDICATOR SHORT,
    RETURN  INDICATOR SHORT,
    RETURN  DOUBLE);
/
SHOW ERRORS;

---------------------------------- rqHarmonic ---------------------------------
--
CREATE FUNCTION rqHarmonic(
  n IN PLS_INTEGER)
RETURN DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqHarmonic"
PARAMETERS (
    n LONG,
    n INDICATOR SHORT,
    RETURN INDICATOR SHORT,
    RETURN DOUBLE);
/
SHOW ERRORS;

---------------------------------- rqSignP ------------------------------------
--
CREATE FUNCTION rqSignP(
  np IN PLS_INTEGER,
  nn IN PLS_INTEGER)
RETURN DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqSignP"
PARAMETERS (
    np LONG,
    np INDICATOR SHORT,
    nn LONG,
    nn INDICATOR SHORT,
    RETURN INDICATOR SHORT,
    RETURN DOUBLE);
/
SHOW ERRORS;

---------------------------------- rqCvmP -------------------------------------
--
CREATE FUNCTION rqCvmP(
  w IN DOUBLE PRECISION,
  n IN PLS_INTEGER)
RETURN DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqCvmP"
PARAMETERS (
    w DOUBLE,
    w INDICATOR SHORT,
    n LONG,
    n INDICATOR SHORT,
    RETURN INDICATOR SHORT,
    RETURN DOUBLE);
/
SHOW ERRORS;

----------------------------------- rqDcauchy ---------------------------------
--
CREATE FUNCTION rqDcauchy(
    x       DOUBLE PRECISION,
    loc     DOUBLE PRECISION,
    scale   DOUBLE PRECISION)
RETURN      DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_pdf_cauchy"
PARAMETERS (
    x       DOUBLE,
    x       INDICATOR SHORT,
    loc     DOUBLE,
    loc     INDICATOR SHORT,
    scale   DOUBLE,
    scale   INDICATOR SHORT,
    RETURN  INDICATOR SHORT,
    RETURN  DOUBLE);
/
SHOW ERRORS;

------------------------------------- rqDt ------------------------------------
--
CREATE FUNCTION rqDt(
    df          DOUBLE PRECISION,
    ncp         DOUBLE PRECISION,
    logP        PLS_INTEGER,
    x           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_pdf_student"
PARAMETERS (
    df          DOUBLE,
    df          INDICATOR SHORT,
    ncp         DOUBLE,
    ncp         INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    x           DOUBLE,
    x           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

----------------------------------- rqDnorm -----------------------------------
--
CREATE FUNCTION rqDnorm(
    x       DOUBLE PRECISION)
RETURN      DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_pdf_normal"
PARAMETERS (
    x       DOUBLE,
    x       INDICATOR SHORT,
    RETURN  INDICATOR SHORT,
    RETURN  DOUBLE);
/
SHOW ERRORS;

------------------------------------ rqDexp -----------------------------------
--
CREATE FUNCTION rqDexp(
    lambda  DOUBLE PRECISION,
    x       DOUBLE PRECISION)
RETURN      DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_pdf_exponential"
PARAMETERS (
    lambda  DOUBLE,
    lambda  INDICATOR SHORT,
    x       DOUBLE,
    x       INDICATOR SHORT,
    RETURN  INDICATOR SHORT,
    RETURN  DOUBLE);
/
SHOW ERRORS;

--------------------------------- rqDsignrank ---------------------------------
--
CREATE FUNCTION rqDsignrank(
    n           DOUBLE PRECISION,
    logP        PLS_INTEGER,
    x           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_pdf_signrank"
PARAMETERS (
    n           DOUBLE,
    n           INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    x           DOUBLE,
    x           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

-------------------------------- rqPsignrank ----------------------------------
--
CREATE FUNCTION rqPsignrank(
    n           DOUBLE PRECISION,
    lowerTail   PLS_INTEGER,
    logP        PLS_INTEGER,
    x           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_prob_signrank"
PARAMETERS (
    n           DOUBLE,
    n           INDICATOR SHORT,
    lowerTail   INT,
    lowerTail   INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    x           DOUBLE,
    x           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

-------------------------------- rqQsignrank ----------------------------------
--
CREATE FUNCTION rqQsignrank(
    n           DOUBLE PRECISION,
    lowerTail   PLS_INTEGER,
    logP        PLS_INTEGER,
    x           DOUBLE PRECISION)
RETURN          DOUBLE PRECISION
PARALLEL_ENABLE
AS LANGUAGE C
LIBRARY rq$lib
NAME "rqss_quantile_signrank"
PARAMETERS (
    n           DOUBLE,
    n           INDICATOR SHORT,
    lowerTail   INT,
    lowerTail   INDICATOR SHORT,
    logP        INT,
    logP        INDICATOR SHORT,
    x           DOUBLE,
    x           INDICATOR SHORT,
    RETURN      INDICATOR SHORT,
    RETURN      DOUBLE);
/
SHOW ERRORS;

--***************************************************************************--
--*  (*) FUNCTIONS: Kolmogorov-Smirnov                                      *--
--***************************************************************************--

-- EXPONENTIAL DISTRIBUTION ---------------------------------------------------
--
CREATE FUNCTION rqKstestPexp(
  ownername  IN VARCHAR2,
  tablename  IN VARCHAR2,
  columnname IN VARCHAR2,
  rate       IN NUMBER
)
RETURN rqNumericEltSet
AUTHID CURRENT_USER
IS
  lambda    NUMBER;
  mu        NUMBER;
  d         NUMBER;
  sig       NUMBER;
  line      VARCHAR2(255);
  status    INTEGER;
  output    rqNumericEltSet;
BEGIN
  lambda := rate;
  mu     := 0;
  DBMS_OUTPUT.ENABLE(1000000);
  DBMS_STAT_FUNCS.EXPONENTIAL_DIST_FIT (
    ownername  => DBMS_ASSERT.ENQUOTE_NAME(ownername, FALSE),
    tablename  => DBMS_ASSERT.ENQUOTE_NAME(tablename, FALSE),
    columnname => DBMS_ASSERT.ENQUOTE_NAME(columnname, FALSE),
    test_type  => 'KOLMOGOROV_SMIRNOV',
    lambda     => lambda,
    mu         => mu,
    sig        => sig);
  DBMS_OUTPUT.GET_LINE(line, status);
  DBMS_OUTPUT.DISABLE;
  d := TO_NUMBER(SUBSTR(line, 11));

  output := rqNumericEltSet();
  output.EXTEND(2);
  output(1) := rqNumericElt(1, d);
  output(2) := rqNumericElt(2, sig);

  RETURN output;
END rqKstestPexp;
/
SHOW ERRORS;

-- NORMAL DISTRIBUTION --------------------------------------------------------
--
CREATE FUNCTION rqKstestPnorm(
  ownername  IN VARCHAR2,
  tablename  IN VARCHAR2,
  columnname IN VARCHAR2,
  mean       IN NUMBER,
  sd         IN NUMBER
)
RETURN rqNumericEltSet
AUTHID CURRENT_USER
IS
  meann     NUMBER;
  stdev     NUMBER;
  d         NUMBER;
  sig       NUMBER;
  line      VARCHAR2(255);
  status    INTEGER;
  output    rqNumericEltSet;
BEGIN
  meann := mean;
  stdev := sd;
  DBMS_OUTPUT.ENABLE(1000000);
  DBMS_STAT_FUNCS.NORMAL_DIST_FIT (
    ownername  => DBMS_ASSERT.ENQUOTE_NAME(ownername, FALSE),
    tablename  => DBMS_ASSERT.ENQUOTE_NAME(tablename, FALSE),
    columnname => DBMS_ASSERT.ENQUOTE_NAME(columnname, FALSE),
    test_type  => 'KOLMOGOROV_SMIRNOV',
    mean       => meann,
    stdev      => stdev,
    sig        => sig);
  DBMS_OUTPUT.GET_LINE(line, status);
  DBMS_OUTPUT.DISABLE;
  d := TO_NUMBER(SUBSTR(line, 11));

  output := rqNumericEltSet();
  output.EXTEND(2);
  output(1) := rqNumericElt(1, d);
  output(2) := rqNumericElt(2, sig);

  RETURN output;
END rqKstestPnorm;
/
SHOW ERRORS;

-- POISSON DISTRIBUTION -------------------------------------------------------
--
CREATE FUNCTION rqKstestPpois(
  ownername  IN VARCHAR2,
  tablename  IN VARCHAR2,
  columnname IN VARCHAR2,
  lambda     IN NUMBER
)
RETURN rqNumericEltSet
AUTHID CURRENT_USER
IS
  lambdaa   NUMBER;
  d         NUMBER;
  sig       NUMBER;
  line      VARCHAR2(255);
  status    INTEGER;
  output    rqNumericEltSet;
BEGIN
  lambdaa := lambda;
  DBMS_OUTPUT.ENABLE(1000000);
  DBMS_STAT_FUNCS.POISSON_DIST_FIT (
    ownername  => DBMS_ASSERT.ENQUOTE_NAME(ownername, FALSE),
    tablename  => DBMS_ASSERT.ENQUOTE_NAME(tablename, FALSE),
    columnname => DBMS_ASSERT.ENQUOTE_NAME(columnname, FALSE),
    test_type  => 'KOLMOGOROV_SMIRNOV',
    lambda     => lambdaa,
    sig        => sig);
  DBMS_OUTPUT.GET_LINE(line, status);
  DBMS_OUTPUT.DISABLE;
  d := TO_NUMBER(SUBSTR(line, 11));

  output := rqNumericEltSet();
  output.EXTEND(2);
  output(1) := rqNumericElt(1, d);
  output(2) := rqNumericElt(2, sig);

  RETURN output;
END rqKstestPpois;
/
SHOW ERRORS;

-- UNIFORM DISTRIBUTION -------------------------------------------------------
--
CREATE FUNCTION rqKstestPunif(
  ownername  IN VARCHAR2,
  tablename  IN VARCHAR2,
  columnname IN VARCHAR2,
  minx       IN NUMBER,
  maxx       IN NUMBER
)
RETURN rqNumericEltSet
AUTHID CURRENT_USER
IS
  paramA    NUMBER;
  paramB    NUMBER;
  d         NUMBER;
  sig       NUMBER;
  line      VARCHAR2(255);
  status    INTEGER;
  output    rqNumericEltSet;
BEGIN
  paramA := minx;
  paramB := maxx;
  DBMS_OUTPUT.ENABLE(1000000);
  DBMS_STAT_FUNCS.UNIFORM_DIST_FIT (
    ownername  => DBMS_ASSERT.ENQUOTE_NAME(ownername, FALSE),
    tablename  => DBMS_ASSERT.ENQUOTE_NAME(tablename, FALSE),
    columnname => DBMS_ASSERT.ENQUOTE_NAME(columnname, FALSE),
    var_type   => 'CONTINUOUS',
    test_type  => 'KOLMOGOROV_SMIRNOV',
    paramA     => paramA,
    paramB     => paramB,
    sig        => sig);
  DBMS_OUTPUT.GET_LINE(line, status);
  DBMS_OUTPUT.DISABLE;
  d := TO_NUMBER(SUBSTR(line, 11));

  output := rqNumericEltSet();
  output.EXTEND(2);
  output(1) := rqNumericElt(1, d);
  output(2) := rqNumericElt(2, sig);

  RETURN output;
END rqKstestPunif;
/
SHOW ERRORS;

-- WEIBULL DISTRIBUTION -------------------------------------------------------
--
CREATE FUNCTION rqKstestPweibull(
  ownername  IN VARCHAR2,
  tablename  IN VARCHAR2,
  columnname IN VARCHAR2,
  shape      IN NUMBER,
  scale      IN NUMBER
)
RETURN rqNumericEltSet
AUTHID CURRENT_USER
IS
  alpha     NUMBER;
  mu        NUMBER;
  beta      NUMBER;
  d         NUMBER;
  sig       NUMBER;
  line      VARCHAR2(255);
  status    INTEGER;
  output    rqNumericEltSet;
BEGIN
  alpha := scale;
  mu    := 0;
  beta  := shape;
  DBMS_OUTPUT.ENABLE(1000000);
  DBMS_STAT_FUNCS.WEIBULL_DIST_FIT (
    ownername  => DBMS_ASSERT.ENQUOTE_NAME(ownername, FALSE),
    tablename  => DBMS_ASSERT.ENQUOTE_NAME(tablename, FALSE),
    columnname => DBMS_ASSERT.ENQUOTE_NAME(columnname, FALSE),
    test_type  => 'KOLMOGOROV_SMIRNOV',
    alpha      => alpha,
    mu         => mu,
    beta       => beta,
    sig        => sig);
  DBMS_OUTPUT.GET_LINE(line, status);
  DBMS_OUTPUT.DISABLE;
  d := TO_NUMBER(SUBSTR(line, 11));

  output := rqNumericEltSet();
  output.EXTEND(2);
  output(1) := rqNumericElt(1, d);
  output(2) := rqNumericElt(2, sig);

  RETURN output;
END rqKstestPweibull;
/
SHOW ERRORS;

--***************************************************************************--
--*  (*) PROCEDURE: rqForeachUpdate                                         *--
--***************************************************************************--

CREATE PROCEDURE rqForeachUpdate(
  num                            NUMBER)
AUTHID DEFINER
AS
BEGIN
  MERGE INTO rqForeach D
  USING (SELECT id
         FROM   (select 1 id, 1 val from dual)
         MODEL DIMENSION BY  (id)
         MEASURES            (val)
         RULES               (val[FOR id FROM 1 TO num INCREMENT 1] 
                              = CV(id))) S
  ON    (D.id = S.id)
  WHEN NOT MATCHED THEN INSERT (D.id) VALUES (S.id);
  COMMIT;
END;
/
SHOW ERRORS

--***************************************************************************--
--*  (*) PROCEDURES: Data Store                                             *--
--***************************************************************************--

CREATE TYPE rqCharSet AS TABLE OF VARCHAR2(128);
/

CREATE TYPE rqNumericSet AS TABLE OF NUMBER;
/

CREATE TYPE rqRefDBObj IS OBJECT (
      name VARCHAR2(128),
      dtyp VARCHAR2(128),
      parm VARCHAR2(128));
/

CREATE TYPE rqRefDBObjSet IS TABLE of rqRefDBObj;
/

CREATE PROCEDURE rq$AddDataStoreObjectImpl(
    ds_owner   IN VARCHAR2, 
    ds_name    IN VARCHAR2, 
    obj_name   IN VARCHAR2, 
    obj_class  IN VARCHAR2,
    obj_size   IN integer,
    obj_length IN integer,
    obj_nrow   IN integer,
    obj_ncol   IN integer
)
IS 
    v_dsID number(20);
    v_objID number(20);
    v_objver varchar2(16);
    v_objexists integer;
BEGIN
     -- get dsID from named datastore
      select dsID into v_dsID
      from rq$datastore
      where dsowner = ds_owner AND dsname = ds_name;

     -- check if objname aleardy exist in named datastore
     select count(*) into v_objexists
     from rq$datastoreobject
     where dsID = v_dsID AND objname = obj_name;

     IF v_objexists > 0 THEN 
        raise_application_error(-20101, 
                    'Object already exists in named datastore');
     END IF;
    
     -- get a new objID from sequence
     select rq$datastore_seq.nextval into v_objID from sys.dual;
     -- get ORE version
     select value into v_objver from sys.rq_config where name = 'VERSION';
     -- insert object meta data
     insert into rq$datastoreobject
      values(v_objID, v_dsID, obj_name, obj_class, obj_size, 
             obj_length, obj_nrow, obj_ncol, v_objver);

     return;

EXCEPTION
  WHEN OTHERS THEN
       RAISE;
       RETURN;
END;
/
SHOW ERRORS;

CREATE PROCEDURE rq$AddDataStoreObject(
    ds_name    IN VARCHAR2, 
    obj_name   IN VARCHAR2, 
    obj_class  IN VARCHAR2,
    obj_size   IN integer,
    obj_length IN integer,
    obj_nrow   IN integer,
    obj_ncol   IN integer
)
AUTHID CURRENT_USER
IS
   ds_owner VARCHAR2(128);
BEGIN
   ds_owner := SYS_CONTEXT('USERENV', 'CURRENT_USER');
   rq$AddDataStoreObjectImpl(ds_owner, ds_name, obj_name, 
               obj_class, obj_size, obj_length, obj_nrow, obj_ncol);
END;
/
SHOW ERRORS;

CREATE PROCEDURE rq$AddDataStoreRefDBObjectImpl(
    ds_owner     IN VARCHAR2, 
    ds_name      IN VARCHAR2, 
    obj_name     IN VARCHAR2,
    refobj_id    IN number, 
    refobj_name  IN VARCHAR2,
    refobj_type  IN VARCHAR2,
    refobj_parm  IN VARCHAR2,
    refobj_owner IN VARCHAR2
)
IS 
    v_objID number(20) := NULL;
BEGIN
    -- get objID
    select objID into v_objID 
    from RQ$DATASTORE a, RQ$DATASTOREOBJECT b
    where a.dsowner = ds_owner AND a.dsname = ds_name AND
          b.objname = obj_name AND a.dsID = b.dsID;

    -- insert objID with the associated referenced db object id
    insert into RQ$DATASTOREREFDBOBJECT
    values(v_objID, refobj_id);

    -- insert referenced db object if not existed yet
    insert into RQ$REFDBOBJECT
    select refobj_id, refobj_name, refobj_type, refobj_parm, refobj_owner
    from dual where refobj_id NOT IN (select refobjID from RQ$REFDBOBJECT);

EXCEPTION
   WHEN OTHERS THEN
     raise_application_error(-20101, 
                 'Object ' || to_char(v_objID) || ' or ' || 
                 refobj_owner || ' ' || refobj_name || ' ' || upper(refobj_type) || ' does not exist in named datastore');
     RETURN;
END;
/
SHOW ERRORS;

CREATE FUNCTION rq$GetRefDBObjectID(
    refobj_name  IN VARCHAR2,
    refobj_type  IN VARCHAR2,
    refobj_owner IN VARCHAR2
)
RETURN number
AUTHID CURRENT_USER
IS
   v_refobjID number := NULL;
   v_refobjTyp VARCHAR2(16);
   v_refobjNam VARCHAR2(128);
BEGIN
   -- get referenced db object ID
   if (refobj_type = 'rqScript') then
     v_refobjTyp := 'VIEW';
     v_refobjNam := refobj_name || '_V';
   else
     if (refobj_type = 'model') then
       v_refobjTyp := 'MINING MODEL';
     else
       v_refobjTyp := refobj_type;
     end if;
     v_refobjNam := refobj_name;
   end if;

   select object_id into v_refobjID
   from all_objects
   where owner = refobj_owner AND object_name = upper(v_refobjNam) AND
         object_type = upper(v_refobjTyp);

   -- error out when v_refobjID is null
   IF v_refobjID IS NULL THEN
     raise_application_error(-20101, 'Database ' || refobj_type ||
       ' object ' || refobj_owner || '.' || refobj_name ||
       ' no longer exists');
   END IF;
   
   return v_refobjID;
END;
/
SHOW ERRORS;

CREATE PROCEDURE rq$AddDataStoreRefDBObject(
    ds_name      IN VARCHAR2, 
    obj_name     IN VARCHAR2, 
    refobj_name  IN VARCHAR2,
    refobj_type  IN VARCHAR2,
    refobj_parm  IN VARCHAR2,
    refobj_owner IN VARCHAR2
)
AUTHID CURRENT_USER
IS
   ds_owner VARCHAR2(128);
   v_refobjID number := NULL;
BEGIN
   -- get referenced db object ID
   v_refobjID := rq$GetRefDBObjectID(refobj_name, refobj_type, refobj_owner);

   ds_owner := SYS_CONTEXT('USERENV', 'CURRENT_USER');
   rq$AddDataStoreRefDBObjectImpl(ds_owner, ds_name, obj_name, 
                                 v_refobjID, refobj_name, refobj_type,
                                 refobj_parm, refobj_owner);
END;
/
SHOW ERRORS;

CREATE PROCEDURE rq$AddRSessionRefDBObjectImpl(
    sess_owner   IN VARCHAR2,
    rsess        IN number,
    refobj_id    IN number,
    refobj_name  IN VARCHAR2,
    refobj_type  IN VARCHAR2,
    refobj_parm  IN VARCHAR2,
    refobj_owner IN VARCHAR2
)
IS 
BEGIN
    -- insert session info with the associated refdbobject id
    insert into RQ$OREREFDBOBJECT
    values(sess_owner, rsess, refobj_id);

    -- insert referenced db object if not existed yet
    insert into RQ$REFDBOBJECT
    select refobj_id, refobj_name, refobj_type, refobj_parm, refobj_owner
    from dual where refobj_id NOT IN (select refobjID from RQ$REFDBOBJECT);

EXCEPTION
   WHEN OTHERS THEN
     raise_application_error(-20101, 
                 'Object ' || to_char(refobj_id) || 
                 ' does not exist in named datastore');
     RETURN;
END;
/
SHOW ERRORS;

CREATE PROCEDURE rq$AddRSessionRefDBObject(
    rsess        IN VARCHAR2,
    refobj_name  IN VARCHAR2,
    refobj_type  IN VARCHAR2,
    refobj_parm  IN VARCHAR2,
    refobj_owner IN VARCHAR2
)
AUTHID CURRENT_USER
IS
   v_refobjID number := NULL;
   v_sessowner VARCHAR2(128);
BEGIN
   -- get referenced db object ID
   v_refobjID := rq$GetRefDBObjectID(refobj_name, refobj_type, refobj_owner);

   v_sessowner := SYS_CONTEXT('USERENV', 'CURRENT_USER');
   rq$AddRSessionRefDBObjectImpl(v_sessowner, to_number(rsess),
                                 v_refobjID, refobj_name, refobj_type,
                                 refobj_parm, refobj_owner);
END;
/
SHOW ERRORS;

CREATE FUNCTION rq$DeleteRefDBObjects(del_refIds rqNumericSet, 
                                      ds_owner   VARCHAR2,
                                      ds_only    boolean default FALSE)
RETURN rqRefDBObjSet
IS
  del_refObjs rqRefDBObjSet := NULL;
BEGIN
  -- delete refdbobject record that are no longer used by  
  -- refdbobject owner in either datastorerefdbobject or orerefdbobject
  IF (del_refIds IS NOT NULL) THEN
    IF (ds_only) THEN
      -- check refdbobject on datastore use only
      delete from RQ$REFDBOBJECT a where a.refobjID IN (
        select t.column_value from table(del_refIds) t
        where t.column_value NOT IN (
          select distinct b.refobjID 
          from RQ$DATASTOREREFDBOBJECT b, RQ$DATASTORESUMMARY c
          where b.objID = c.objID and 
                c.dsowner = ds_owner)
        ) and a.refobjowner = ds_owner
      returning rqRefDBObj(a.refobjName, a.refobjType, a.refobjParm)
      BULK COLLECT INTO del_refObjs;
    ELSE
      delete from RQ$REFDBOBJECT a where a.refobjID IN (
        select t.column_value from table(del_refIds) t
        where t.column_value NOT IN (
          select distinct b.refobjID 
          from RQ$DATASTOREREFDBOBJECT b, RQ$DATASTORESUMMARY c
          where b.objID = c.objID and 
                c.dsowner = ds_owner)
          AND t.column_value NOT IN (
          select distinct d.refobjID from RQ$OREREFDBOBJECT d
          where d.sessionowner = ds_owner)
        ) and a.refobjowner = ds_owner
      returning rqRefDBObj(a.refobjName, a.refobjType, a.refobjParm)
      BULK COLLECT INTO del_refObjs;
    END IF;
  ELSE
    -- delete all ref db objects no longer used by owner
    delete from RQ$REFDBOBJECT a where a.refobjID NOT IN (
      select distinct b.refobjID 
      from RQ$DATASTOREREFDBOBJECT b, RQ$DATASTORESUMMARY c
      where b.objID = c.objID and c.dsowner = a.refobjowner)
      AND a.refobjID NOT IN (
      select distinct d.refobjID from RQ$OREREFDBOBJECT d
      where d.sessionowner = a.refobjowner)
    returning rqRefDBObj(a.refobjName, a.refobjType, a.refobjParm)
    BULK COLLECT INTO del_refObjs;
  END IF;

  COMMIT;
  return del_refObjs;
END;
/
SHOW ERRORS;

CREATE PROCEDURE rq$DropRefDBObjects(
  refObjs     rqRefDBObjSet
)
AUTHID CURRENT_USER
IS
  drp_qry VARCHAR2(256);
BEGIN
  -- drop no-longer referenced db objects
  FOR i IN refObjs.FIRST..refObjs.LAST LOOP
    if (refObjs(i).dtyp = 'rqScript') then
      drp_qry := 'begin rqsys.rq$OREScriptDrop(:1); end;';
      execute immediate drp_qry using refObjs(i).name;
    elsif (refObjs(i).dtyp = 'model') then
        drp_qry := 'begin dbms_data_mining.drop_model(:1); exception when others then NULL; end;';
--        dbms_output.put_line(drp_qry || ': ' || refObjs(i).name);
        execute immediate drp_qry using refObjs(i).name;
    else
      if (refObjs(i).dtyp = 'table') then
        drp_qry := 'drop table ' ||
                   sys.dbms_assert.enquote_name(refObjs(i).name) || ' purge';
      elsif (refObjs(i).dtyp = 'function') then
        drp_qry := 'drop function ' ||
                   sys.dbms_assert.enquote_name(refObjs(i).name);
      elsif (refObjs(i).dtyp = 'package') then
        drp_qry := 'drop package ' ||
                   sys.dbms_assert.enquote_name(refObjs(i).name);
      elsif (refObjs(i).dtyp = 'view') then
        drp_qry := 'drop view ' ||
                   sys.dbms_assert.enquote_name(refObjs(i).name);
      else
        raise_application_error(-20101, refObjs(i).dtyp || ' ' ||
          refObjs(i).name || ' not a supported db reference object'); 
      end if;
      execute immediate drp_qry;
    end if;
  END LOOP;
END;
/
SHOW ERRORS;

CREATE PROCEDURE rq$DropDataStoreImpl(
  ds_owner IN VARCHAR2,
  ds_name  IN VARCHAR2,
  del_objIds OUT rqNumericSet,
  del_refIds OUT rqNumericSet
)
IS
  v_dsID number := NULL;
BEGIN
  del_objIds := NULL;
  del_refIds := NULL;
  -- get R object Ids within the named datastore
  select b.objID BULK COLLECT into del_objIds
  from RQ$DATASTORE a, RQ$DATASTOREOBJECT b
  where a.dsowner = ds_owner AND a.dsname = ds_name AND
        a.dsID = b.dsID;

  -- get RefDBObject Ids used by the named datastore
  select unique(c.refobjID) BULK COLLECT into del_refIds
  from RQ$DATASTORE a, RQ$DATASTOREOBJECT b, RQ$DATASTOREREFDBOBJECT c
  where a.dsowner = ds_owner AND a.dsname = ds_name AND
        a.dsID = b.dsID AND b.objID = c.objID;

  -- delete datastore record
  delete from RQ$DATASTORE where dsowner = ds_owner AND dsname = ds_name
  returning dsID into v_dsID;

  if (v_dsID is null) then
    del_objIds := NULL;
    del_refIds := NULL;
  end if;

  COMMIT;
END;
/
SHOW ERRORS;

CREATE FUNCTION rq$getDataStoreTabImp(
  ds_name  VARCHAR2,
  ds_owner VARCHAR2,
  ds_user  VARCHAR2)
RETURN VARCHAR2
IS
  v_tabnam VARCHAR2(128);
BEGIN
  IF ds_owner = ds_user THEN
    select tabname into v_tabnam
    from rq$DATASTORE
    where dsowner = ds_owner and dsname = ds_name;
  ELSE
    select distinct tabname into v_tabnam
    from rq$DATASTORE a, RQ$DATASTOREACCESS b
    where (b.grantee = ds_user or 
          b.grantee = 'PUBLIC') and b.dsId = a.dsId and 
          a.dsowner = ds_owner and a.dsname = ds_name;
  END IF;

  IF v_tabnam IS NULL THEN
    v_tabnam := 'RQ$DATASTOREINVENTORY';
  END IF;

  return v_tabnam;

EXCEPTION
  WHEN NO_DATA_FOUND THEN 
    raise_application_error(-20101, 'DataStore ' || ds_name ||
      ' does not belong to user ' || ds_owner || 
      ' or the current user does not have read privilege to this datastore');
  WHEN OTHERS THEN
    RAISE;  
END;
/
SHOW ERRORS;

CREATE FUNCTION rq$getDataStoreTab(
  ds_name  VARCHAR2,
  ds_owner VARCHAR2 default NULL)
RETURN VARCHAR2
AUTHID CURRENT_USER
IS
  v_user   VARCHAR2(128);
  v_owner  VARCHAR2(128);
BEGIN
  v_user := SYS_CONTEXT('USERENV', 'CURRENT_USER');
  IF ds_owner IS NULL THEN
    v_owner := v_user;
  ELSE
    v_owner := ds_owner;
  END IF;

  return rq$getDataStoreTabImp(ds_name, v_owner, v_user);
END;
/
SHOW ERRORS;

CREATE PROCEDURE rq$DeleteRObjectsImpl(
  ds_owner  IN VARCHAR2,
  ds_name   IN VARCHAR2,
  obj_names IN rqCharSet,
  silent    IN BOOLEAN,
  del_objIds OUT rqNumericSet,
  del_refIds OUT rqNumericSet
)
IS
  missing_ds   EXCEPTION;
  missing_objs EXCEPTION;
  v_dsexist    number;
  v_objIds     rqNumericSet := NULL;
  delta        number;
BEGIN
  del_refIds := NULL;
  del_objIds := NULL;

  -- check if datastore exists
  select count(*) into v_dsexist
  from RQ$DATASTORE a
  where a.dsowner = ds_owner AND a.dsname = ds_name;

  IF v_dsexist = 0 THEN
    IF silent = FALSE THEN
      RAISE missing_ds;
    ELSE
      return;
    END IF;
  END IF;

  -- delete datastore record
  IF (obj_names is not null) THEN
    -- delete named R objects
    select b.objID BULK COLLECT into v_objIds
    from RQ$DATASTORE a, RQ$DATASTOREOBJECT b, table(obj_names) c
    where a.dsowner = ds_owner AND a.dsname = ds_name AND
          b.objname = c.column_value AND
          a.dsID = b.dsID;
  ELSE
    -- delete all R objects
    select b.objID BULK COLLECT into v_objIds
    from RQ$DATASTORE a, RQ$DATASTOREOBJECT b
    where a.dsowner = ds_owner AND a.dsname = ds_name AND
          a.dsID = b.dsID;
  END IF;

  IF (v_objIds IS NOT NULL) THEN
    -- get del_refIds
    select unique(refobjID) BULK COLLECT into del_refIds 
    from RQ$DATASTOREREFDBOBJECT a, table(v_objIds) b
    where a.objID = b.column_value;

    -- get del_objIds
    delete from RQ$DATASTOREOBJECT where objID IN (
      select column_value from table(v_objIds))
      returning objID BULK COLLECT INTO del_objIds;
  END IF;

  IF (obj_names is not null) THEN
    delta := obj_names.COUNT - del_objIds.COUNT;
    IF delta <> 0 THEN
      RAISE missing_objs;
    END IF;
  END IF;

  COMMIT;

EXCEPTION
  WHEN missing_ds THEN
    ROLLBACK;
    raise_application_error(-20101, ' Datastore ' || ds_name ||
               ' does not exist in user ' || ds_owner);
  WHEN missing_objs THEN
    ROLLBACK;
    raise_application_error(-20101, to_char(delta) || ' R Objects ' ||
               'do not exist in datastore ' || ds_name);
  WHEN OTHERS THEN
    ROLLBACK;
    RAISE;
END;
/
SHOW ERRORS;

CREATE PROCEDURE rqDeleteRObjects(
  ds_name   IN VARCHAR2,
  obj_names IN rqCharSet,
  silent    IN BOOLEAN DEFAULT FALSE
)
AUTHID CURRENT_USER
IS
  ds_owner VARCHAR2(128);
  del_objIds rqNumericSet;
  del_refIds rqNumericSet;
  del_refobjs rqRefDBObjSet;
  tabnam   VARCHAR2(128);
BEGIN
  ds_owner := SYS_CONTEXT('USERENV', 'CURRENT_USER');
  rq$DeleteRObjectsImpl(ds_owner, ds_name, obj_names, silent, 
                        del_objIds, del_refIds);
  IF (del_objIds IS NULL) THEN
   return;
  END IF;

  if (del_refIds IS NOT NULL and del_refIds.count > 0) then
    del_refobjs := rq$DeleteRefDBObjects(del_refIds, ds_owner);
    -- drop no-longer referenced db objects
    if (del_refobjs IS NOT NULL and del_refobjs.count > 0) then
      rq$DropRefDBObjects(del_refobjs);
    end if;
  end if;

  -- get datastore table name
  tabnam := rqsys.rq$getDataStoreTab(ds_name);

  -- remove from datastore table
  execute immediate 
    'delete from ' || dbms_assert.enquote_name(tabnam) || 
    ' where objID IN (' ||
    'select column_value from table(:del_objIds)) ' using del_objIds; 
  COMMIT;
END;
/
SHOW ERRORS;

CREATE PROCEDURE rq$DeleteORERefDBObjectImpl(
   rsess        IN number,
   refobj_owner IN VARCHAR2,
   refobj_name  IN VARCHAR2,
   refobj_type  IN VARCHAR2,
   del_refIds   OUT rqNumericSet
)
IS
BEGIN
  del_refIds := NULL;
  IF (refobj_name IS NULL) THEN
    -- delete all records kept for rsess in RQ$OREREFDBOBJECT
    delete from RQ$OREREFDBOBJECT where oresession = rsess
    returning refobjID BULK COLLECT INTO del_refIds;
  ELSE
    -- delete one record in RQ$OREREFDBOBJECT
    delete from RQ$OREREFDBOBJECT 
    where rowid in (
    select row_id from (
      select rowid row_id, oresession, refobjID,
             row_number() over(partition by refobjID order by refobjID) dup
      from RQ$OREREFDBOBJECT) t, RQ$REFDBOBJECT a
    where t.dup = 1 and a.refobjID = t.refobjID and t.oresession = rsess and 
          a.refobjowner = refobj_owner and a.refobjname = refobj_name and 
          a.refobjtype = refobj_type)
    returning refobjID BULK COLLECT INTO del_refIds;
  END IF;

  IF (del_refIds IS NOT NULL) THEN
    del_refIds := set(del_refIds);
  END IF;
END;
/
SHOW ERRORS

CREATE PROCEDURE rq$DeleteORERefDBObject(
  rsess        IN VARCHAR2,
  refobj_name  IN VARCHAR2 default NULL,
  refobj_type  IN VARCHAR2 default NULL,
  refobj_owner IN VARCHAR2 default NULL,
  refobj_drop  IN BOOLEAN  default TRUE
)
AUTHID CURRENT_USER
IS
  ds_owner     VARCHAR2(128);
  del_refIds   rqNumericSet;
  del_refobjs  rqRefDBObjSet;
BEGIN
  rq$DeleteORERefDBObjectImpl(to_number(rsess), refobj_owner, 
                              refobj_name, refobj_type, del_refIds);

  if (del_refIds is not null and del_refIds.count > 0) then
    ds_owner := SYS_CONTEXT('USERENV', 'CURRENT_USER');
    if (refobj_name is not null) then
      del_refobjs := rq$DeleteRefDBObjects(del_refIds, ds_owner);
    else
      if (refobj_drop) then
        del_refobjs := rq$DeleteRefDBObjects(del_refIds, ds_owner, TRUE);
      else
        del_refobjs := NULL;
      end if;
    end if;

    if (del_refobjs is not null and del_refobjs.count > 0) then
      -- drop no-longer referenced db objects
      rq$DropRefDBObjects(del_refobjs);
    end if;
  end if;
END;
/
SHOW ERRORS;

CREATE PROCEDURE rq$AddDataStoreImpl(
   ds_owner   IN VARCHAR2, 
   ds_name    IN VARCHAR2, 
   ds_desc    IN VARCHAR2,
   ds_append  IN integer,
   ds_tabnam  IN OUT VARCHAR2
) 
IS 
      v_dsID     number(20);
      v_dsexists integer;
BEGIN
      -- get new dsID from sequence
      select rq$datastore_seq.nextval into v_dsID from sys.dual;

      -- create datastore record
      insert into RQ$DATASTORE(dsID, dsowner, dsname, cdate, 
                               description, tabname)
      values(v_dsID, ds_owner, ds_name, sysdate, ds_desc, ds_tabnam);
      COMMIT;

EXCEPTION
  WHEN DUP_VAL_ON_INDEX THEN
    IF ds_append = 0  THEN
      raise_application_error(-20101, 'Datastore ' || ds_name || 
                              ' already exists');
    ELSE
      IF (ds_append = 2) THEN
        -- update cdate and description in overwrite case
        update RQ$DATASTORE set cdate = sysdate, description = ds_desc
        where dsowner = ds_owner and dsname = ds_name;
      END IF;
      -- use the existing datastore underlying table
      ds_tabnam := NULL;
    END IF;
  RETURN;
END;
/
SHOW ERRORS;

CREATE PROCEDURE rq$AddDataStore(
   ds_name    IN VARCHAR2, 
   ds_desc    IN VARCHAR2,
   ds_append  IN integer,
   ds_tabnam  IN VARCHAR2
)
AUTHID CURRENT_USER 
IS
   ds_owner VARCHAR2(128);
   tabnam   VARCHAR2(128) := ds_tabnam;
BEGIN
   ds_owner := SYS_CONTEXT('USERENV', 'CURRENT_USER');
   IF (ds_append = 2) THEN
     -- overwrite case: delete all R objects if datastore exists
     -- no error out if datastore does not exists
     rqDeleteRObjects(ds_name, NULL, TRUE);
   END IF;

   -- create new datastore meta data if not exists
   rq$AddDataStoreImpl(ds_owner, ds_name, ds_desc, ds_append, tabnam);

   IF (tabnam IS NOT NULL) THEN
     -- create new datastore table
     execute immediate 'create table ' || dbms_assert.enquote_name(tabnam) ||
                       '  (objID        NUMBER,' ||
                          'chunkid      NUMBER,' ||
                          'value        RAW(2000))';

     execute immediate 'create index ' || 
                          dbms_assert.enquote_name(tabnam || '_idx') ||
                          ' on ' ||
                          dbms_assert.enquote_name(tabnam) || ' (objID)';
   END IF;
END;
/
SHOW ERRORS;

CREATE PROCEDURE rq$OREScriptCreate(
  v_name                         VARCHAR2,
  v_script                       CLOB)
AUTHID CURRENT_USER
AS
BEGIN
  EXECUTE IMMEDIATE 'begin sys.rqScriptCreate(:1, :2); end;' 
                    using v_name, v_script;

  EXECUTE IMMEDIATE 'create view ' ||
                    dbms_assert.enquote_name(v_name || '_V') || ' as ' ||
                    '  select script from USER_RQ_SCRIPTS ' ||
                    '  where name = ' ||
                    dbms_assert.enquote_literal(v_name);
END;
/
SHOW ERRORS;

CREATE PROCEDURE rq$OREScriptDrop(
  v_name                         VARCHAR2)
AUTHID CURRENT_USER
AS
BEGIN
--  EXECUTE IMMEDIATE 'drop function ORE$RQS' || v_name;
  EXECUTE IMMEDIATE 'drop view ' || dbms_assert.enquote_name(v_name || '_V');
  EXECUTE IMMEDIATE 'begin sys.rqScriptDrop(:1); end;' using v_name;
END;
/
SHOW ERRORS;

CREATE PROCEDURE rq$ScriptDropAny(
  v_owner                      VARCHAR2,
  v_name                       VARCHAR2)
AS
BEGIN
  delete from sys.rq$script where owner = v_owner and name = v_name;
END;
/
SHOW ERRORS;

--***************************************************************************--
--*  (*) ORE 1.5 R SCRIPTS                                                  *--
--***************************************************************************--

CREATE PROCEDURE rq$GrantRevokeRefDBObjects(
  refObjs     rqRefDBObjSet,
  v_grantee   VARCHAR2,
  v_type      VARCHAR2
)
AUTHID CURRENT_USER
IS
  qry     VARCHAR2(256);
  tofrm   VARCHAR2(8);
  grarev  VARCHAR2(8);
  usrnam  VARCHAR2(128);
  refnam  VARCHAR2(128);
  reftyp  VARCHAR2(128);
  invalid_reftyp   EXCEPTION;
BEGIN
  if (v_type = 'GRANT') then
    tofrm := ' to ';
    grarev := 'GRANT';
  else
    tofrm := ' from ';
    grarev := 'REVOKE';
  end if;

  SAVEPOINT grantrevoke_refdbobj;

  -- grant/revoke access to/from referenced db objects
  FOR i IN refObjs.FIRST..refObjs.LAST LOOP
    reftyp := refObjs(i).dtyp;
    refnam := refObjs(i).name;
    if (reftyp = 'rqScript') then
--      qry := v_type || ' select on ' || refObjs(i).name || '_V' || 
--             tofrm || v_grantee;
      if (v_grantee = 'PUBLIC') then
        usrnam := NULL;
      else
        usrnam := v_grantee;
      end if;

      if (v_type = 'GRANT') then
        qry := 'begin rqGrant(:1, :2, :3); end;';
      else
        qry := 'begin rqRevoke(:1, :2, :3); end;';
      end if;
      execute immediate qry using refnam, 'rqscript', usrnam;
    else
      if (reftyp = 'table') then
        qry := grarev || ' select on ' || dbms_assert.enquote_name(refnam) ||
               tofrm || dbms_assert.enquote_name(v_grantee);
      elsif (reftyp = 'model') then
        qry := grarev || ' select on mining model ' ||
               dbms_assert.enquote_name(refnam) ||
               tofrm || dbms_assert.enquote_name(v_grantee);
      elsif (reftyp = 'package' OR reftyp = 'function') then
        qry := grarev || ' execute on ' || dbms_assert.enquote_name(refnam) ||
               tofrm || dbms_assert.enquote_name(v_grantee);
      else
        RAISE invalid_reftyp;
      end if;
      execute immediate qry;
    end if;
  END LOOP;
EXCEPTION
  WHEN invalid_reftyp THEN
    ROLLBACK TO grantrevoke_refdbobj;
    raise_application_error(-20101, 'Database ' || reftyp ||
         ' object ' || refnam || ' is not recognized');
  WHEN OTHERS THEN
    ROLLBACK TO grantrevoke_refdbobj;
    raise_application_error(-20100, 'Grant or revoke access of ' || 
         'reference db object ' ||  qry || ' failed');
END;
/
SHOW ERRORS;

------------------------------------ rq$UpdateDSAccess -------------------------
CREATE FUNCTION rq$UpdateDSAccess(
  v_owner    VARCHAR2,
  v_name     VARCHAR2,
  v_grantee  VARCHAR2,
  v_type     VARCHAR2)
return rqRefDBObjSet
IS
  v_revoked   VARCHAR2(128) := NULL;
  acc_refObjs rqRefDBObjSet := NULL;
  v_exists    number;
  foreign_refs   EXCEPTION;
  revoke_fail    EXCEPTION;
BEGIN
  SAVEPOINT start_DSAccess;

  IF (v_type = 'REVOKE') THEN
    delete from rq$DataStoreAccess
    where grantee = v_grantee and dsID IN (
    select dsID from rq$DataStore
    where dsowner = v_owner and dsname = v_name)
    returning dsID into v_revoked;

    IF v_revoked IS NULL THEN
      RAISE revoke_fail;
    END IF;
  END IF;
  

  -- check if any refdbobject used by datastore v_name comes from other users
  select count(*) into v_exists
  from  RQ$DATASTORE a, RQ$DATASTOREOBJECT b, RQ$DATASTOREREFDBOBJECT c,
        RQ$REFDBOBJECT o
  where a.dsowner = v_owner and a.dsname = v_name and 
        a.dsID = b.dsID and b.objID = c.objID and 
        c.refobjID = o.refobjID and o.refobjowner != v_owner;

  IF v_exists > 0 THEN
    RAISE foreign_refs;
  END IF;

  -- get all of reference objects used by datastore with v_owner and v_name but 
  -- not yet granted to v_grantee
  select rqRefDBObj(o.refobjName, o.refobjType, o.refobjParm)
         BULK COLLECT into acc_refObjs
  from  RQ$DATASTORE a, RQ$DATASTOREOBJECT b, RQ$DATASTOREREFDBOBJECT c,
        RQ$REFDBOBJECT o
  where a.dsowner = v_owner and a.dsname = v_name and 
        a.dsID = b.dsID and b.objID = c.objID and o.refobjID = c.refobjID and
        c.refobjID NOT IN (
  select f.refobjID
  from   RQ$DATASTOREACCESS d, RQ$DATASTOREOBJECT e, RQ$DATASTOREREFDBOBJECT f
  where  d.grantee = v_grantee and d.dsID = e.dsID and e.objID = f.objID);

  IF (v_type = 'GRANT') THEN
    insert into rq$DataStoreAccess (dsID, grantee)
    select dsID, v_grantee from rq$DataStore
    where dsowner = v_owner and dsname = v_name;
  END IF;
  
  return acc_refObjs;
EXCEPTION
  WHEN DUP_VAL_ON_INDEX THEN
    ROLLBACK TO start_DSAccess;
    IF (v_type = 'GRANT')  THEN
      raise_application_error(-20100, v_owner || ' has already granted ' ||
        'datastore ' || v_name || ' to user ' || v_grantee);
    ELSE
      RAISE;
    END IF;
  WHEN revoke_fail THEN
    ROLLBACK TO start_DSAccess;
    raise_application_error(-20100, v_owner || ' did not grant ' ||
        'datastore ' || v_name || ' to user ' || v_grantee);
  WHEN foreign_refs THEN
    ROLLBACK TO start_DSAccess;
    raise_application_error(-20100, 'Cannot ' || v_type || 
      ' privilege for datastore ' || v_name || ' containing ORE objects' ||
      ' that reference database objects not owned by the current user');
  WHEN OTHERS THEN
    ROLLBACK TO start_DSAccess;
    RAISE;
END;
/
SHOW ERRORS

------------------------------------ rq$GrantRevokeDSImp ----------------------------
--
CREATE PROCEDURE rq$GrantRevokeDSImp(
  v_owner    VARCHAR2,
  v_name     VARCHAR2,
  v_user     VARCHAR2,
  v_type     VARCHAR2)
AUTHID CURRENT_USER
IS
  v_grantee  VARCHAR2(128);
  v_tabname  VARCHAR2(128);
  v_refObjs  rqRefDBObjSet;
BEGIN
  IF (v_user IS NULL) THEN
    v_grantee := 'PUBLIC';
  ELSE
    v_grantee := v_user;
  END IF;

  v_tabname := rq$getDataStoreTab(v_name);
  IF v_tabname = 'RQ$DATASTOREINVENTORY' THEN
    raise_application_error(-20100, 'Datastore ''' || v_name || 
      ''' is not grantable');
  END IF;

  -- update DataStoreAccess table and 
  -- return refDBObjects that need to grant or revoke
  v_refObjs := rq$UpdateDSAccess(v_owner, v_name, v_grantee, v_type);

  -- grant/revoke privilege to/from underlying datastore table
  IF (v_type = 'GRANT') THEN
    Execute Immediate 'grant select on ' ||
      dbms_assert.enquote_name(v_tabname) || ' to ' ||
                               dbms_assert.enquote_name(v_grantee);
  ELSE
    Execute Immediate 'revoke select on ' ||
      dbms_assert.enquote_name(v_tabname) || ' from ' ||
                               dbms_assert.enquote_name(v_grantee);
  END IF;

  IF (v_refObjs IS NOT NULL and v_refObjs.count > 0) THEN
    -- grant/revoke access to/from ref objects
    rq$GrantRevokeRefDBObjects(v_refObjs, v_grantee, v_type);
  END IF;
END;
/
SHOW ERRORS

------------------------------------ rq$UpdateScriptAccess --------------------
--
CREATE PROCEDURE rq$UpdateScriptAccess(
  v_owner    VARCHAR2,
  v_name     VARCHAR2,
  v_user     VARCHAR2,
  v_type     VARCHAR2)
IS
  v_grantee  VARCHAR2(128);
  v_revoked  VARCHAR2(128) := NULL;
BEGIN
  IF (v_user IS NULL) THEN
    v_grantee := 'PUBLIC';
  ELSE
    v_grantee := v_user;
  END IF;

  SAVEPOINT start_ScriptAccess;

  IF (v_type = 'GRANT') THEN
    -- insert grant entry into access table
    insert into sys.rq$scriptAccess
    values (v_owner, v_name, v_user);
  ELSE
    IF (v_user IS NULL) THEN
      delete from sys.rq$scriptAccess
      where owner = v_owner and name = v_name and grantee IS NULL
      returning name into v_revoked;
    ELSE
      delete from sys.rq$scriptAccess
      where owner = v_owner and name = v_name and grantee = v_user
      returning name into v_revoked;
    END IF;

    IF (v_revoked IS NULL) THEN
      raise_application_error(-20100, 'User ''' || v_owner || 
        ''' did not grant access of Script ''' || v_name || ''' to ''' ||
        v_grantee || '''');
    END IF;
  END IF;
       
  COMMIT;
EXCEPTION
  WHEN DUP_VAL_ON_INDEX THEN
    ROLLBACK TO start_ScriptAccess;
    raise_application_error(-20100, 'Access to script ''' || 
      v_name || ''' has already been granted to ' || v_grantee);
  WHEN OTHERS THEN
    ROLLBACK TO start_ScriptAccess;
    RAISE;
END;
/
SHOW ERRORS;

------------------------------------ rqGrant ----------------------------------
--
CREATE PROCEDURE rqGrant(
  v_name         VARCHAR2,
  v_type         VARCHAR2,                   
  v_user         VARCHAR2 default NULL)
AUTHID CURRENT_USER
AS
  v_owner    VARCHAR2(128);
  v_exist    number;
BEGIN
  v_owner := SYS_CONTEXT('USERENV', 'CURRENT_USER');

  -- check if v_user exists
  IF v_user IS NOT NULL THEN
    select count(*) into v_exist from all_users
    where username = v_user;
    IF (v_exist = 0) THEN
      raise_application_error(-20100, 'User ''' || v_user ||
                              ''' does not exist');
    END IF;
  END IF;

  -- check v_type
  IF (v_type != 'datastore' AND v_type != 'rqscript') THEN
     raise_application_error(-20100, 'Only ''datastore'' and ''rqscript'' ' ||
       'are supported. ''' || v_type || ''' is invalid');
  END IF;

  -- check current user owns the named script or datastore
  IF (v_type = 'rqscript') THEN
    select count(*) into v_exist from user_rq_scripts
    where name = v_name;

    IF v_exist = 0 THEN
      -- check if this is global script
      select count(*) into v_exist from all_rq_scripts
      where owner = 'RQSYS' and name = v_name;

      IF v_exist > 0 THEN
        raise_application_error(-20100, '''' || v_name || 
                                ''' is a global script');
      ELSE
        raise_application_error(-20100, 'Script ''' || v_name || 
          ''' does not exist or does not belong to user ' || v_owner);
      END IF;
    END IF;
  ELSE
    select count(*) into v_exist from user_rq_datastores
    where dsname = v_name;

    IF v_exist = 0 THEN
      raise_application_error(-20100, 'Datastore ''' || v_name || 
        ''' does not exist or does not belong to user ' || v_owner);
    END IF;
  END IF;

  -- check if owner and grantee is same
  IF (v_owner = v_user) THEN
    raise_application_error(-20100, 'No need grant access of ' || 
       case v_type when 'rqscript' then 'script' else v_type end ||
     ' ''' || v_name || ''' to its owner ' || v_user);
  END IF;

  -- grant the access privilege
  IF (v_type = 'rqscript') THEN
    -- insert grant entry into access table
    rq$UpdateScriptAccess(v_owner, v_name, v_user, 'GRANT');
  ELSE
    -- grant underlying table and reference objects if any to v_user
    rq$GrantRevokeDSImp(v_owner, v_name, v_user, 'GRANT');
  END IF;

  COMMIT;
EXCEPTION
  WHEN OTHERS THEN
    RAISE;
END;
/
SHOW ERRORS

------------------------------------ rqRevoke ----------------------------------
--
CREATE PROCEDURE rqRevoke(
  v_name         VARCHAR2,
  v_type         VARCHAR2,
  v_user         VARCHAR2 default NULL)
AUTHID CURRENT_USER
AS
  v_owner    VARCHAR2(128);
  v_exist    number;
BEGIN
  v_owner := SYS_CONTEXT('USERENV', 'CURRENT_USER');

  -- check if v_user exists
  IF v_user IS NOT NULL THEN
    select count(*) into v_exist from all_users
    where username = v_user;
    IF (v_exist = 0) THEN
      raise_application_error(-20100, 'User ''' || v_user || 
                              ''' does not exist');
    END IF;
  END IF;

  -- check v_type
  IF (v_type != 'datastore' AND v_type != 'rqscript') THEN
     raise_application_error(-20100, 'Only ''datastore'' and ''rqscript'' ' ||
       'are supported. ''' || v_type || ''' is invalid');
  END IF;

  -- check current user owns the named script or datastore
  IF (v_type = 'rqscript') THEN
    select count(*) into v_exist from user_rq_scripts
    where name = v_name;

    IF v_exist = 0 THEN
      -- check if this is global script
      select count(*) into v_exist from all_rq_scripts
      where owner = 'RQSYS' and name = v_name;

      IF v_exist > 0 THEN
        raise_application_error(-20100, '''' || v_name || 
                                ''' is a global script');
      ELSE
        raise_application_error(-20100, 'Script ''' || v_name ||
          ''' does not exist or does not belong to user ''' || v_owner || '''');
      END IF;
    END IF;
  ELSE
    select count(*) into v_exist from user_rq_datastores
    where dsname = v_name;

    IF v_exist = 0 THEN
      raise_application_error(-20100, 'Datastore ''' || v_name || 
        ''' does not exist or does not belong to user ' || v_owner);
    END IF;
  END IF;

  -- check if owner and grantee is same
  IF (v_owner = v_user) THEN
    raise_application_error(-20100, 'Cannot revoke access of ' || 
      case v_type when 'rqscript' then 'script' else v_type end ||
      ' ''' || v_name || ''' from its owner ''' || v_user || '''');
  END IF;

  -- Revoke access privilege
  IF (v_type = 'rqscript') THEN
    -- delete grant entry from access table
    rq$UpdateScriptAccess(v_owner, v_name, v_user, 'REVOKE');
  ELSE
    -- revoke underlying table and reference objects if any from v_user
    rq$GrantRevokeDSImp(v_owner, v_name, v_user, 'REVOKE');
  END IF;

  COMMIT;
EXCEPTION
  WHEN OTHERS THEN
    RAISE;
END;
/
SHOW ERRORS

-- rqDropDataStore calls rqRevoke
CREATE PROCEDURE rqDropDataStore(
  ds_name  IN VARCHAR2
)
AUTHID CURRENT_USER
IS
  ds_owner VARCHAR2(128);
  del_objIds rqNumericSet;
  del_refIds rqNumericSet;
  del_refobjs rqRefDBObjSet;
  tabnam   VARCHAR2(128);
  v_grantees rqCharSet;
BEGIN
  ds_owner := SYS_CONTEXT('USERENV', 'CURRENT_USER');
  -- get datastore table name
  tabnam := rqsys.rq$getDataStoreTab(ds_name);

  rq$DropDataStoreImpl(ds_owner, ds_name, del_objIds, del_refIds);
  IF del_objIds IS NULL THEN
    raise_application_error(-20101, 'DataStore ' ||
                            ds_name || ' does not exist');
  END IF;

  if (del_refIds IS NOT NULL and del_refIds.count > 0) then
    del_refobjs := rq$DeleteRefDBObjects(del_refIds, ds_owner);
    -- drop no-longer referenced db objects
    if (del_refobjs IS NOT NULL and del_refobjs.count > 0) then
      rq$DropRefDBObjects(del_refobjs);
    end if;
  end if;

  if (tabnam = 'RQ$DATASTOREINVENTORY') then
    -- remove from rq$datastoreinventory
    execute immediate 
      'delete from ' || dbms_assert.enquote_name(tabnam) ||
      ' c where c.objID IN (' ||
      'select column_value from table(:del_objIds))' using del_objIds;
  else
    -- revoke read privilege if granted for datastore ds_name
    select grantee BULK COLLECT into v_grantees
    from USER_RQ_DATASTORE_PRIVS
    where dsname = ds_name;

    IF (v_grantees IS NOT NULL and v_grantees.count > 0) THEN
      FOR i IN 1..v_grantees.count LOOP
        rqRevoke(ds_name, 'datastore', v_grantees(i));
      END LOOP;
    END IF;
    -- drop underlying table and its prvilege grant
    execute immediate 'drop table ' || dbms_assert.enquote_name(tabnam);
  end if;
  COMMIT;
END;
/
SHOW ERRORS;

--***************************************************************************--
--*  (*) OBJECT PRIVILEGES                                                  *--
--***************************************************************************--

GRANT EXECUTE ON rqObject TO PUBLIC;
GRANT EXECUTE ON rqObjSet TO PUBLIC;
GRANT EXECUTE ON rqXMLObj TO PUBLIC;
GRANT EXECUTE ON rqXMLSet TO PUBLIC;
GRANT EXECUTE ON rqImgObj TO PUBLIC;
GRANT EXECUTE ON rqImgSet TO PUBLIC;
GRANT EXECUTE ON rqCharSet TO PUBLIC;
GRANT EXECUTE ON rqNumericSet TO PUBLIC;

GRANT EXECUTE ON rq$AddDataStore TO PUBLIC;
GRANT EXECUTE ON rq$AddDataStoreObject TO PUBLIC;
GRANT EXECUTE ON rq$AddDataStoreRefDBObject TO PUBLIC;
GRANT EXECUTE ON rq$AddRSessionRefDBObject TO PUBLIC;
GRANT EXECUTE ON rq$GetDataStoreTAB TO PUBLIC;
GRANT EXECUTE ON rqDropDataStore TO PUBLIC;
GRANT EXECUTE ON rqDeleteRObjects TO PUBLIC;
GRANT EXECUTE ON rq$DeleteORERefDBObject TO PUBLIC;
GRANT EXECUTE ON rq$GetRefDBObjectID TO PUBLIC;
GRANT EXECUTE ON rq$OREScriptCreate TO PUBLIC;
GRANT EXECUTE ON rq$OREScriptDrop TO PUBLIC;
GRANT EXECUTE ON rqEvalImpl TO PUBLIC;
GRANT EXECUTE ON rqEval TO PUBLIC;
GRANT EXECUTE ON rqTableEvalImpl TO PUBLIC;
GRANT EXECUTE ON rqTableEval TO PUBLIC;
GRANT EXECUTE ON rqGroupEvalImpl TO PUBLIC;
GRANT EXECUTE ON rqRowEvalImpl TO PUBLIC;
GRANT EXECUTE ON rqRowEval TO PUBLIC;
GRANT EXECUTE ON RQ_ELEM_T TO PUBLIC;
GRANT EXECUTE ON RQ_PARAM_T TO PUBLIC;
GRANT EXECUTE ON rqRFuncEvalChr TO PUBLIC;
GRANT EXECUTE ON rqRFuncEvalNum TO PUBLIC;
GRANT EXECUTE ON rqForeachUpdate to PUBLIC;
GRANT EXECUTE ON rqBesselI TO PUBLIC;
GRANT EXECUTE ON rqBesselK TO PUBLIC;
GRANT EXECUTE ON rqBesselJ TO PUBLIC;
GRANT EXECUTE ON rqBesselY TO PUBLIC;
GRANT EXECUTE ON rqNumericEltSet TO PUBLIC;
GRANT EXECUTE ON rqKstestPexp TO PUBLIC;
GRANT EXECUTE ON rqKstestPnorm TO PUBLIC;
GRANT EXECUTE ON rqKstestPpois TO PUBLIC;
GRANT EXECUTE ON rqKstestPunif TO PUBLIC;
GRANT EXECUTE ON rqKstestPweibull TO PUBLIC;
GRANT EXECUTE ON rqCrossprodImpl TO PUBLIC;
GRANT EXECUTE ON rqCrossprod TO PUBLIC;
GRANT EXECUTE ON rqUnlistTable TO PUBLIC;
GRANT EXECUTE ON rqGamma TO PUBLIC;
GRANT EXECUTE ON rqLgamma TO PUBLIC;
GRANT EXECUTE ON rqDigamma TO PUBLIC;
GRANT EXECUTE ON rqTrigamma TO PUBLIC;
GRANT EXECUTE ON rqErf TO PUBLIC;
GRANT EXECUTE ON rqErfc TO PUBLIC;
GRANT EXECUTE ON rqPbeta TO PUBLIC;
GRANT EXECUTE ON rqQbeta TO PUBLIC;
GRANT EXECUTE ON rqQcauchy TO PUBLIC;
GRANT EXECUTE ON rqPcauchy TO PUBLIC;
GRANT EXECUTE ON rqDchisq TO PUBLIC;
GRANT EXECUTE ON rqPchisq TO PUBLIC;
GRANT EXECUTE ON rqQchisq TO PUBLIC;
GRANT EXECUTE ON rqPexp TO PUBLIC;
GRANT EXECUTE ON rqQexp TO PUBLIC;
GRANT EXECUTE ON rqDgamma TO PUBLIC;
GRANT EXECUTE ON rqQgamma TO PUBLIC;
GRANT EXECUTE ON rqPgamma TO PUBLIC;
GRANT EXECUTE ON rqDnbinom TO PUBLIC;
GRANT EXECUTE ON rqPnbinom TO PUBLIC;
GRANT EXECUTE ON rqQnbinom TO PUBLIC;
GRANT EXECUTE ON rqPnorm TO PUBLIC;
GRANT EXECUTE ON rqQnorm TO PUBLIC;
GRANT EXECUTE ON rqPpois TO PUBLIC;
GRANT EXECUTE ON rqQpois TO PUBLIC;
GRANT EXECUTE ON rqQt TO PUBLIC;
GRANT EXECUTE ON rqPt TO PUBLIC;
GRANT EXECUTE ON rqPweibull TO PUBLIC;
GRANT EXECUTE ON rqQweibull TO PUBLIC;
GRANT EXECUTE ON rqDweibull TO PUBLIC;
GRANT EXECUTE ON rqHarmonic TO PUBLIC;
GRANT EXECUTE ON rqSignP TO PUBLIC;
GRANT EXECUTE ON rqCvmP TO PUBLIC;
GRANT EXECUTE ON rqDcauchy TO PUBLIC;
GRANT EXECUTE ON rqDpois TO PUBLIC;
GRANT EXECUTE ON rqDt TO PUBLIC;
GRANT EXECUTE ON rqDnorm TO PUBLIC;
GRANT EXECUTE ON rqDexp TO PUBLIC;
GRANT EXECUTE ON rqDbeta TO PUBLIC;

GRANT EXECUTE ON rqStepwiseType TO PUBLIC;
GRANT EXECUTE ON rqStepwiseTypeSet TO PUBLIC;
GRANT EXECUTE ON rqStepwiseImpl TO PUBLIC;
GRANT EXECUTE ON rqStepwise TO PUBLIC;

GRANT EXECUTE ON rqNeuralType TO PUBLIC;
GRANT EXECUTE ON rqNeuralTypeSet TO PUBLIC;
GRANT EXECUTE ON rqNeuralImpl TO PUBLIC;
GRANT EXECUTE ON rqNeural TO PUBLIC;

GRANT EXECUTE ON rqDf TO PUBLIC;
GRANT EXECUTE ON rqPf TO PUBLIC;
GRANT EXECUTE ON rqQf TO PUBLIC;

GRANT EXECUTE ON rqDsignrank TO PUBLIC;
GRANT EXECUTE ON rqPsignrank TO PUBLIC;
GRANT EXECUTE ON rqQsignrank TO PUBLIC;

GRANT EXECUTE ON rqDbinom TO PUBLIC;
GRANT EXECUTE ON rqPbinom TO PUBLIC;
GRANT EXECUTE ON rqQbinom TO PUBLIC;

GRANT EXECUTE ON rqGrant TO rqAdmin;
GRANT EXECUTE ON rqRevoke TO rqAdmin;

--***************************************************************************--
--*  (*) PUBLIC SYNONYMS                                                    *--
--***************************************************************************--

create public synonym rqObject for rqsys.rqObject;
create public synonym rqObjSet for rqsys.rqObjSet;
create public synonym rqXMLObj for rqsys.rqXMLObj;
create public synonym rqXMLSet for rqsys.rqXMLSet;
create public synonym rqImgObj for rqsys.rqImgObj;
create public synonym rqImgSet for rqsys.rqImgSet;
create public synonym rqCharSet for rqsys.rqCharSet;
create public synonym rqNumericSet for rqsys.rqNumericSet;

create public synonym rqGrant for rqsys.rqGrant;
create public synonym rqRevoke for rqsys.rqRevoke;
create public synonym rq$AddDataStore for rqsys.rq$AddDataStore;
create public synonym rq$AddDataStoreObject for rqsys.rq$AddDataStoreObject;
create public synonym rq$AddDataStoreRefDBObject for 
                      rqsys.rq$AddDataStoreRefDBObject;
create public synonym rq$AddRSessionRefDBObject for 
                      rqsys.rq$AddRSessionRefDBObject;
create public synonym rqDropDataStore for rqsys.rqDropDataStore;
create public synonym rqDeleteRObjects for rqsys.rqDeleteRObjects;
create public synonym rq$DeleteORERefDBObject for rqsys.rq$DeleteORERefDBObject;
create public synonym rqEvalImpl for rqsys.rqEvalImpl;
create public synonym rqEval for rqsys.rqEval;
create public synonym rqTableEvalImpl for rqsys.rqTableEvalImpl;
create public synonym rqTableEval for rqsys.rqTableEval;
create public synonym rqGroupEvalImpl for rqsys.rqGroupEvalImpl;
create public synonym rqRowEvalImpl for rqsys.rqRowEvalImpl;
create public synonym rqRowEval for rqsys.rqRowEval;
create public synonym rq_elem_t for rqsys.rq_elem_t;
create public synonym rq_param_t for rqsys.rq_param_t;
create public synonym rqRFuncEvalChr for rqsys.rqRFuncEvalChr;
create public synonym rqRFuncEvalNum for rqsys.rqRFuncEvalNum;
create public synonym rqForeachUpdate for rqsys.rqForeachUpdate;
create public synonym rqBesselI for rqsys.rqBesselI;
create public synonym rqBesselK for rqsys.rqBesselK;
create public synonym rqBesselJ for rqsys.rqBesselJ;
create public synonym rqBesselY for rqsys.rqBesselY;
create public synonym rqNumericEltSet for rqsys.rqNumericEltSet;
create public synonym rqKstestPexp for rqsys.rqKstestPexp;
create public synonym rqKstestPnorm for rqsys.rqKstestPnorm;
create public synonym rqKstestPpois for rqsys.rqKstestPpois;
create public synonym rqKstestPunif for rqsys.rqKstestPunif;
create public synonym rqKstestPweibull for rqsys.rqKstestPweibull;
create public synonym rqCrossprodImpl for rqsys.rqCrossprodImpl;
create public synonym rqCrossprod for rqsys.rqCrossprod;
create public synonym rqUnlistTable for rqsys.rqUnlistTable;
create public synonym rqGamma for rqsys.rqGamma;
create public synonym rqLgamma for rqsys.rqLgamma;
create public synonym rqDigamma for rqsys.rqDigamma;
create public synonym rqTrigamma for rqsys.rqTrigamma;
create public synonym rqErf for rqsys.rqErf;
create public synonym rqErfc for rqsys.rqErfc;
create public synonym rqPbeta for rqsys.rqPbeta;
create public synonym rqQbeta for rqsys.rqQbeta;
create public synonym rqQcauchy for rqsys.rqQcauchy;
create public synonym rqPcauchy for rqsys.rqPcauchy;
create public synonym rqDchisq for rqsys.rqDchisq;
create public synonym rqPchisq for rqsys.rqPchisq;
create public synonym rqQchisq for rqsys.rqQchisq;
create public synonym rqPexp for rqsys.rqPexp;
create public synonym rqQexp for rqsys.rqQexp;
create public synonym rqDf for rqsys.rqDf;
create public synonym rqPf for rqsys.rqPf;
create public synonym rqQf for rqsys.rqQf;
create public synonym rqDgamma for rqsys.rqDgamma;
create public synonym rqQgamma for rqsys.rqQgamma;
create public synonym rqPgamma for rqsys.rqPgamma;
create public synonym rqDnbinom for rqsys.rqDnbinom;
create public synonym rqPnbinom for rqsys.rqPnbinom;
create public synonym rqQnbinom for rqsys.rqQnbinom;
create public synonym rqPnorm for rqsys.rqPnorm;
create public synonym rqQnorm for rqsys.rqQnorm;
create public synonym rqPpois for rqsys.rqPpois;
create public synonym rqQpois for rqsys.rqQpois;
create public synonym rqQt for rqsys.rqQt;
create public synonym rqPt for rqsys.rqPt;
create public synonym rqPweibull for rqsys.rqPweibull;
create public synonym rqQweibull for rqsys.rqQweibull;
create public synonym rqDweibull for rqsys.rqDweibull;
create public synonym rqHarmonic for rqsys.rqHarmonic;
create public synonym rqSignP for rqsys.rqSignP;
create public synonym rqCvmP for rqsys.rqCvmP;
create public synonym rqDcauchy for rqsys.rqDcauchy;
create public synonym rqDpois for rqsys.rqDpois;
create public synonym rqDt for rqsys.rqDt;
create public synonym rqDnorm for rqsys.rqDnorm;
create public synonym rqDexp for rqsys.rqDexp;
create public synonym rqDbeta for rqsys.rqDbeta;

create public synonym rqStepwiseType for rqsys.rqStepwiseType;
create public synonym rqStepwiseTypeSet for rqsys.rqStepwiseTypeSet;
create public synonym rqStepwiseImpl for rqsys.rqStepwiseImpl;
create public synonym rqStepwise for rqsys.rqStepwise;

create public synonym rqNeuralType for rqsys.rqNeuralType;
create public synonym rqNeuralTypeSet for rqsys.rqNeuralTypeSet;
create public synonym rqNeuralImpl for rqsys.rqNeuralImpl;
create public synonym rqNeural for rqsys.rqNeural;

create public synonym rqPsignrank for rqsys.rqPsignrank;
create public synonym rqQsignrank for rqsys.rqQsignrank;
create public synonym rqDsignrank for rqsys.rqDsignrank;

create public synonym rqDbinom for rqsys.rqDbinom;
create public synonym rqPbinom for rqsys.rqPbinom;
create public synonym rqQbinom for rqsys.rqQbinom;

--***************************************************************************--
--*  end of file rqproc.sql                                                 *--
--***************************************************************************--

OHA YOOOO