Open Source Oracle Compatible PostgreSQL.

Overview

LICENSE build regression

IvorySQL

IvorySQL is advanced, fully featured, open source Oracle compatible PostgreSQL with a firm commitment to always remain 100% compatible and a Drop-in replacement of the latest PostgreSQL. IvorySQL adds a “compatible_db” toggle switch to switch between Oracle and PostgreSQL compatibility modes. One of the highlights of IvorySQL is PL/iSQL procedural language that supports oracle’s PL/SQL syntax and Oracle style Packages.

IvorySQL has imported and enhanced the Orafce extension to add support for numerous Oracle compatibility features including built-in PACKAGES, data types, and conversion functions

The IvorySQL project is released under the Apache 2 license and encourages all types of contributions. For IvorySQL community no contribution is too small, and we want to thank all our community contributors.


We are committed to following the principles of the open source way

We are committed to abiding by the principles of open-source ways and we strongly believe in building a healthy and inclusive community. We maintain that good ideas can come from anywhere, and the best ideas should win. Only by including diverse perspectives, we can reach the best decision. While the first version of IvorySQL is mainly focused on Oracle Compatibility features, going forward the future road map and feature set will be determined by the community in an open-source way.

Compiling from source

IvorySQL can be built on Linux, OSX, Unix and Windows platforms. This section describes the step to compile the source on the Linux based systems.

Getting the source

Clone the repository with either of the following command:

git clone https://github.com/IvorySQL/IvorySQL.git
git clone [email protected]:IvorySQL/IvorySQL.git

Requirements

To compile the IvorySQL from the source code, you have to ensure that prerequisite packages are available on the system.

  • Required Packages The following software packages are required for building IvorySQL:

    • make - GNU make version 3.80 or newer
    • gcc - ISO/ANSI C compiler (at least C99-compliant). Recent versions of GCC are recommended.
    • libreadline - The GNU Readline library is used by default.
    • zlib - zlib compression library is used by default.
    • Flex - (Flex 2.5.31 or later)
    • Bison - (Bison 1.875 or later)
  • Optional Packages The following packages are optional. They are not required in the default configuration, but they are needed when certain build options are enabled.

    • libperl - (Perl 5.8.3 or later) To build the server programming language PL/Perl. Perl library installation with the header files. libperl library must be a shared library
    • libpython - (Python 2.6 or later, Python 3.1 or later) To build the PL/Python server programming language. Python installation with the header files and the distutils module. libpython library must be a shared library.
    • Tcl - (Tcl 8.4 or later) To build the PL/Tcl procedural language.
    • Gettext API - (Tcl 8.4 or later) To enable Native Language Support (NLS), to display a program's messages in a language other than English.
    • OpenSSL - (1.0.1 or later) To support encrypted client connections.
    • LZ4 - To support compression of data.

Preparing System

Following are the minimal packages needed to build from source:

sudo yum install -y bison-devel readline-devel zlib-devel openssl-devel wget
sudo yum groupinstall -y 'Development Tools'

Installation Procedure

  • Configuration The first step of the installation procedure is to configure the source tree for your system and choose the options you would like. This is done by running the configure script. For a default installation simply enter:

    ./configure

    The default configuration will build the server and utilities, as well as all client applications and interfaces that require only a C compiler. All files will be installed under /usr/local/pgsql by default. You can customize the build and installation process by supplying one or more command line options to configure see the details here

  • Build To start the build, type either of:

    make
    make all
    
  • Regression Tests To test the newly built server before you install it, you can run the regression tests at this point. type either of:

    make check
    make check-world
    
  • Installation To install, enter:

    make install
    

Contributing to the IvorySQL

There are plenty of ways to contribute to IvorySQL. You can contribute by providing the documentation updates, by providing the translations for the documentation. If you have design skills you can contribute to the IvorySQL website project. Testing the IvorySQL and reporting issues or by issuing pull requests for bug fixes or new features or answering the questions on mailing lists are some ways to contribute to the IvorySQL project and all types of contributions are welcomed and appreciated by the IvorySQL community.

Documentation

Please check the online documentation.

Comments
  • Support for Hierarchical query. This patch adds the support for the h…

    Support for Hierarchical query. This patch adds the support for the h…

    Support for Hierarchical query. This patch adds the support for the hierarchical query by transforming a Hierarchical Select query on to a Common Table Expression (CTE). This implementation includes hierarchical query syntax and in addition to that following pseudo/special columns as well: - PRIOR - LEVEL - CONNECT_BY_ROOT - SYS_CONNECT_BY_PATH

    Limitations:
    Currently this feature has the following limitations.
    - The additional columns can be used in most expression like function call, CASE
      statement and common expression, however there are few that are not supported
      like ROW, TYPECAST, COLLATE, GROUPING clauses etc.
    -  an output column name may be needed in some cases where two or more column
       are identical like
        SELECT CONNECT_BY_ROOT col AS "col1", CONNECT_BY_ROOT col AS "col2" ....
    - Indirection operator or '*' is not supported.
    - Loop detection is not supported.
    
    opened by rasifr 5
  • The description of the parameter (weekday) of the function (next_day) in the document is incorrect

    The description of the parameter (weekday) of the function (next_day) in the document is incorrect

    ##Current Status In the document, the parameter (weekday) of the function (next_day) is noted as follows. 0 means Sunday. image However, when the parameter (weekday) is set to 0, there is an error in execution. image After verification, the integer value of the parameter (weekday) is 1 to 7, not 0 to 6, 1 represents Sunday, the document is incorrect. the value of Oracle is also 1 to 7. image

    Enhancement

    Please confirm and revise the description in the document.

    enhancement 
    opened by liuxintang 3
  • Sample Package in Doc not working

    Sample Package in Doc not working

    Neither the Package Spec nor the Package Body compiles out of the box. At least in my build from source, the data types of NUMBER and VARCHAR2 are not defined. Even if you switch to PG data types of VARCHAR & NUMERIC it is still not close to working. There are also typos and inconsistencies in both the Spec and Body that also cause it not to work.

    Also, the code in the samples should use spaces for the indenting. It seems to use a horrible combination of spaces and tabs that makes a mess when copy/paste into an editor no matter what your tab settings are.

    I know it's early days, but, this is important. It's a users first impression & first experience.

    bug 
    opened by luss 3
  • type varchar2 does not exist

    type varchar2 does not exist

    type varchar2 does not exist

    IvorySQL 1.2

    OS Version Centos7.6

    Configuration options

    $ /opt/ipg/bin/pg_config |grep CONFIGURE CONFIGURE = '--prefix=/opt/ipg' '--with-openssl' '--with-includes=/usr/include/openssl'

    Current Behavior

    postgres=# CREATE TABLE test(x INT, y VARCHAR2(100)); ERROR: type "varchar2" does not exist LINE 1: CREATE TABLE test(x INT, y VARCHAR2(100));

    Expected behavior/code

    create table success

    Step to reproduce

    CREATE TABLE test(x INT, y VARCHAR2(100));

    Additional context that can be helpful for identifying the problem

    bug 
    opened by jerome-peng 2
  • Implement mechanism to control creation of extensions and other objec…

    Implement mechanism to control creation of extensions and other objec…

    …ts at initdb

    The commit includes the contrib directory to default buid target IvorySQL src. Along with that it  adds a new file ivy_module.config to contrib directory, that can be used to list extensions and SQL scripts required to be executed by initdb.

    ivy_module.config gets installed at '$INSTALL_DIR/share/postgresql/' and is read by initdb to install all extensions and scripts listed in that file.

    opened by codeforall 2
  • IvorySQL1.1 build failed under Windows11

    IvorySQL1.1 build failed under Windows11

    Bug Report

    Copying pg_config_os.h... Generating configuration headers... undefined symbol: PACKAGE_IVORYSQL_VERSION at src/include/pg_config.h line 795 at H:/VisualProject/vs2019/IvorySQL/IvorySQL-Ivory_REL_1_1/src/tools/msvc/Mkvcbuild.pm line 864.

    IvorySQL Version

    1.1

    OS Version (uname -a)

    Windows11 visual studio 2019

    Configuration options ( config.status --config )

    H:\VisualProject\vs2019\IvorySQL\IvorySQL-Ivory_REL_1_1\src\tools\msvc>perl build.pl DEBUG

    Current Behavior

    Expected behavior/code

    Step to reproduce

    Additional context that can be helpful for identifying the problem

    bug 
    opened by liuxintang 2
  • NCHAR and nls_length_semantics=byte

    NCHAR and nls_length_semantics=byte

    Bug Report

    NCHAR is affected setting nls_length_semantics=byte as well as CHAR and VARCHAR2. I think it is undesirable. It may be caused by the native PostgreSQL behavior that accepts type NCHAR as CHAR.

    IvorySQL Version

    1.0 and current master

    OS Version / Configuration options

    V1.0 on RHEL 8.x (install from rpm package) master on CentOS 6.x (source build with configure --enable-debug)

    Current Behavior

    ivdb1=# CREATE EXTENSION orafce ;
    ivdb1=# SET search_path TO "$user", oracle, pg_catalog, public;
    ivdb1=# SET nls_length_semantics TO byte;
    ivdb1=# SELECT NCHAR(10) 'あいうえお';  -- 5 chars, UTF8 3byte char x 5 = 15 bytes
    ERROR:  value too long for type character(10 byte)
    
    bug 
    opened by harukat 2
  • Some problems with char varchar varchar2 and nvarchar2

    Some problems with char varchar varchar2 and nvarchar2

    Bug Report

    1. When I set nls_length_semantics to byte, I get an error when I explicitly convert the string to char, varchar, varchar2.
    2. nvarchar2 does not distinguish between byte and char.

    IvorySQL Version

    1.0

    OS Version (uname -a)

    Linux mypg01 3.10.0-693.21.1.el7.x86_64 #1 SMP Wed Mar 7 19:03:37 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

    Configuration options ( config.status --config )

    set nls_length_semantics to byte ;

    Current Behavior

    select '我是一个中国人'::char(5); 2022-01-04 11:00:18.204 CST [3010] ERROR: value too long for type character(5 byte) 2022-01-04 11:00:18.204 CST [3010] STATEMENT: select '我是一个中国人'::char(5); ERROR: value too long for type character(5 byte)

    create table test_12 (id int, a oracle.nvarchar2(5)); CREATE TABLE insert into test_12 values (1, 'abcde'); INSERT 0 1 insert into test_12 values (1, '少年张三丰'); 2022-01-04 14:27:14.075 CST [3010] ERROR: input value too long for type nvarchar2(5 byte) 2022-01-04 14:27:14.075 CST [3010] STATEMENT: insert into test_12 values (1, '少年张三丰'); ERROR: input value too long for type nvarchar2(5 byte)

    Expected behavior/code

    select '我是一个中国人'::char(5); bpchar

    我 (1 row)

    insert into test_12 values (1, '少年张三丰'); --expect succ

    Step to reproduce

    set nls_length_semantics to byte ; select '我是一个中国人'::char(5);

    create table test_12 (id int, a oracle.nvarchar2(5)); insert into test_12 values (1, 'abcde'); insert into test_12 values (1, '少年张三丰');

    Additional context that can be helpful for identifying the problem

    1. Explicit conversion should output the most suitable string.
    2. nvarchar2 does not distinguish between byte and char.
    bug 
    opened by AndyQinshy 2
  • Support for Hierarchical query. This patch adds the support for the h…

    Support for Hierarchical query. This patch adds the support for the h…

    …ierarchical

    query by transforming a Hierarchical Select query on to a Common Table Expression (CTE). This implementation includes hierarchical query syntax and in addition to that following pseudo/special columns as well:

    • PRIOR
    • LEVEL
    • CONNECT_BY_ROOT
    • SYS_CONNECT_BY_PATH
    opened by rasifr 2
  • Oracle compatible types should be used without schema qualification

    Oracle compatible types should be used without schema qualification

    Enhancement

    Creating a table with an Oracle compatible data type like Varchar2 requires schema qualification that is not very intuitive and also conflicts with the IvorySQL documentation. IvorySQL should allow using these types without schema qualification.

    Current behavior

    CREATE TABLE test_ora_typw(a varchar2);
    ERROR:  type "varchar2" does not exist
    LINE 1: CREATE TABLE test_ora_typw(a varchar2);
                                         ^
    -- Schema qualifying VARCHAR2 with Orcale works 
    CREATE TABLE test_ora_typw(a oracle.varchar2);  
    CREATE TABLE  
    postgres=# 
    

    ###Proposed enhancement

    -- Without schema qualification should work
    CREATE TABLE test_ora_typw(a varchar2);
    
    enhancement REL2.0 
    opened by codeforall 2
  • I would like IvorySQL to have oracle hierarchical queries support

    I would like IvorySQL to have oracle hierarchical queries support

    Hierarchical Query

    Hierarchical queries are very useful to operate on hierarchical data. The PostgreSQL does not support it and It would be a good feature to add into the IvorySQL compatible list.

    The usual clauses for a hierarchical query support are:

    { 
    CONNECT BY [ NOCYCLE ] condition [AND condition]... [ START WITH condition ] 
    | START WITH condition CONNECT BY [ NOCYCLE ] condition [AND condition]...
    }
    

    CONNECT BY The query syntax starts with CONNECT BY keywords which define the hierarchical interdependency between parent and child rows. The results must be further qualified by specifying the PRIOR keyword in the condition part for CONNECT BY clause.

    The PRIOR keyword is a unary operator which links the previous row with the current one. The keyword can be used on the left or the right hand side of the equality condition. In case a loop is detected in the results, an error is returned to the user and the query aborted.

    START WITH This clause specified from which row to start the hierarchy.

    NOCYCLE This clause instructs to return data even if a cycle exists.

    enhancement REL2.0 
    opened by rasifr 2
  • Failed to execute connect by with subquery

    Failed to execute connect by with subquery

    Bug Report

    Failed to execute connect by with subquery , like follow codes

    select * from (select * from area) start with name = 'hangzhou' connect by  pid = prior id;
    

    IvorySQL Version

    2.1

    OS Version (uname -a)

    Linux mypc 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

    Configuration options ( config.status --config )

    Current Behavior

    Test SQL:

    --  create table and build data
    create table area(id int, name text, pid int);
    insert into area values(1, 'china', 0);
    insert into area values(101, 'zhejiang', 1);
    insert into area values(102, 'jiangsu', 1);
    insert into area values(103, 'heilongjiang', 1);
    insert into area values(10101, 'hangzhou', 101);
    insert into area values(10102, 'ningbo', 101);
    insert into area values(10103, 'shaoxing', 101);
    insert into area values(10104, 'wenzhou', 101);
    insert into area values(1010101, 'binjiang', 10101);
    insert into area values(1010102, 'shangcheng', 10101);
    insert into area values(1010103, 'xihu', 10101);
    insert into area values(1010101, 'gongshu', 10101);
    -- select 
    postgres@postgres=# select * from area ;
       id    |     name     |  pid  
    ---------+--------------+-------
           1 | china        |     0
         101 | zhejiang     |     1
         102 | jiangsu      |     1
         103 | heilongjiang |     1
       10101 | hangzhou     |   101
       10102 | ningbo       |   101
       10103 | shaoxing     |   101
       10104 | wenzhou      |   101
     1010101 | binjiang     | 10101
     1010102 | shangcheng   | 10101
     1010103 | xihu         | 10101
     1010101 | gongshu      | 10101
    (12 rows)
    --  normal 
    postgres@postgres=# select * from area start with name = 'hangzhou' connect by  pid = prior id;
       id    |    name    |  pid  
    ---------+------------+-------
       10101 | hangzhou   |   101
     1010101 | binjiang   | 10101
     1010102 | shangcheng | 10101
     1010103 | xihu       | 10101
     1010101 | gongshu    | 10101
    (5 rows)
    --  failed with subquery 
    postgres@postgres=# select * from (select * from area) start with name = 'hangzhou' connect by  pid = prior id;
    server closed the connection unexpectedly
    	This probably means the server terminated abnormally
    	before or while processing the request.
    The connection to the server was lost. Attempting reset: Failed.
    @!?> 
    

    Expected behavior/code

    postgres@postgres=# select * from (select * from area) start with name = 'hangzhou' connect by  pid = prior id;
       id    |    name    |  pid  
    ---------+------------+-------
       10101 | hangzhou   |   101
     1010101 | binjiang   | 10101
     1010102 | shangcheng | 10101
     1010103 | xihu       | 10101
     1010101 | gongshu    | 10101
    (5 rows)
    

    Step to reproduce

    Additional context that can be helpful for identifying the problem

    function transformHierarStmt in analyze.c has question of follow codes.

    	rv = (RangeVar *) linitial(stmt->fromClause);            // not sure fromClause is RangeVar, maybe RangeSubSelect ......
    	cte->ctename = psprintf("cte_%s", rv->relname);   // if rv is not RangeVar, maybe crash here.
    

    detailed :

    static Node *
    transformHierarStmt(ParseState *pstate, SelectStmt *stmt)
    {
    	RangeVar   *rv;
    	ParseState *ps = NULL;
    	ListCell   *lc;
    	CommonTableExpr *cte = makeNode(CommonTableExpr);
    	WithClause *withClause = makeNode(WithClause);
    	List	   *newCols = NIL;
    
    	SelectStmt *ctequery = makeNode(SelectStmt);
    	SelectStmt *ctequery_l = makeNode(SelectStmt);
    	SelectStmt *ctequery_r = makeNode(SelectStmt);
    
    	/* Setup the CTE subquery (anchor and recursive queries) */
    	ctequery->op = SETOP_UNION;
    	ctequery->all = true;
    	ctequery->larg = (SelectStmt *) ctequery_l;
    	ctequery->rarg = (SelectStmt *) ctequery_r;
    
    	/* Buildup a CTE name and fill up other info */
    	rv = (RangeVar *) linitial(stmt->fromClause);            // not sure fromClause is RangeVar, maybe RangeSubquery
    	cte->ctename = psprintf("cte_%s", rv->relname);   // if rv is not RangeVar, maybe crash here.
    	cte->ctequery = (Node *) ctequery;
    	cte->location = -1;
    	cte->aliascolnames = NIL;
    
    	withClause->ctes = list_make1(cte);
    	withClause->recursive = true;
    	withClause->location = -1;
    
    	/* transform targetlist */
    	ps = make_parsestate(pstate);
    	pstate->p_paramref_hook = ps->p_paramref_hook = NULL;
    
    	ctequery_l->fromClause = copyObject(stmt->fromClause);
    	ctequery_r->fromClause = copyObject(stmt->fromClause);
    	transformFromClause(ps, ctequery_l->fromClause);
    
    	ctequery_l->targetList = copyObject(stmt->targetList);
    	ctequery_r->targetList = copyObject(stmt->targetList);
    
    	/* transform left-hand operand of the cte subquery */
    	newCols = transformHierarTargetList(ps, true, &ctequery_l->targetList, NULL);
    
    	/* Build and fill in the CTE's inner select's target list */
    	ctequery_l->intoClause = NULL;
    	ctequery_l->whereClause = NULL;
    	if (stmt->hierarClause != NULL &&
    		stmt->hierarClause->startWith)
    		ctequery_l->whereClause = copyObject(stmt->hierarClause->startWith->condition);
    
    	/*
    	 * make this recursive query's joining condition and adjust it as per
    	 * prior keyword
    	 */
    	ctequery_r->whereClause = copyObject(stmt->hierarClause->connectBy->condition);
    
    	newCols = list_concat_unique(newCols, fixupWhenAndSortClauses(ps, stmt, ctequery_r, rv->relname));
    
    	/* transform right-hand operand of the cte subquery */
    	transformHierarTargetList(ps, false, &ctequery_r->targetList, rv->relname);
    
    	/*
    	 * append pseudo columns list to the target list while avoiding the
    	 * duplicity
    	 */
    	ctequery_l->targetList = list_concat_unique(ctequery_l->targetList, newCols);
    	ctequery_r->targetList = list_concat_unique(ctequery_r->targetList, newCols);
    
    	/* qualify the target list columns with appropriate relation */
    	ctequery_r->targetList = qualifyTlistColumns(ps, ctequery_r->targetList, rv->relname);
    
    	/* add CTE relation to the recursive query */
    	ctequery_r->fromClause = lappend(ctequery_r->fromClause,
    									 makeRangeVar(NULL, cte->ctename, -1));
    
    	/*
    	 * transform the target list of cte query. If there were any
    	 * pseudocolumns, they have been replaced with appropriate values and an
    	 * alias has been created if one was not given. we need to use add these
    	 * column alias here to refer to them.
    	 */
    	pstate->p_cterqry = true;
    	foreach(lc, stmt->targetList)
    	{
    		ResTarget  *res = (ResTarget *) lfirst(lc);
    
    		res->val = resolvePseudoColumns(pstate, (Node *) res->val, res, NULL, NULL);
    	}
    	pstate->p_cterqry = false;
    
    	/*
    	 * The select statement is now part of cte, and it needs to refer to the
    	 * cte in the from clause, instead of the actual table.
    	 */
    	rv->relname = pstrdup(cte->ctename);
    	stmt->withClause = withClause;
    	/* hierarClause is not needed anymore */
    	stmt->hierarClause = NULL;
    
    	return (Node *) stmt;
    }
    
    bug 
    opened by chirpyli 0
  • missing support function 1(16895,25) for attribute 1 of index

    missing support function 1(16895,25) for attribute 1 of index "test_name_idx"

    Bug Report

    missing support function 1(16895,25) for attribute 1 of index "test_name_idx"

    IvorySQL Version

    All versions(1.1~1.5)

    OS Version (uname -a)

    Linux localhost.localdomain 4.18.0-80.el8.x86_64 #1 SMP Tue Jun 4 09:19:46 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

    Configuration options ( config.status --config )

    ./configure --prefix=/home/IVORYSQL --enable-debug --enable-cassert CFLAGS='-O0 -g' --enable-tap-tests

    Current Behavior

    postgres=# select * from test where name = 'test1'; 2022-12-05 13:54:05.240 CST [15604] ERROR: missing support function 1(16895,25) for attribute 1 of index "test_name_idx" 2022-12-05 13:54:05.240 CST [15604] STATEMENT: select * from test where name = 'test1'; ERROR: missing support function 1(16895,25) for attribute 1 of index "test_name_idx"

    Expected behavior/code

    select * from test where name = 'test1'; id | name
    ----+------- 1 | test1

    Step to reproduce

    set compatible_mode to oracle; create table test(id int, name varchar2(100)); insert into test select a,'test'||a from generate_series(1, 10000) a; create index on test(name); select * from test where name = 'test1';

    Additional context that can be helpful for identifying the problem

    bug 
    opened by Huajianjin 0
  • IvorySQL和HGDB对 postgresql 版本的兼容程度

    IvorySQL和HGDB对 postgresql 版本的兼容程度

    Enhancement

    我们团队目前在做数据库相关的研究,注意到 IvorySQL 和 HGDB 都是在 PG 开源的基础上更新的。由于后者不开源,因此想借这个 issue board 请问一下有关事务隔离级别的问题。

    简单来说,我们在 HGDB 6 上发现了一个 wrikte-skew 的异常,这是否是被允许的?据我所知这个 bug 在 pg 12.4 上被修复,但是似乎在 HGDB 上还是存在的。

    image

    在 serializable 的隔离级别下运行。抽象来说,有 3 个事务:

    • T1: W(1,1), R(3, null)
    • T2: W(3,3), R(1, null)
    • T3: W(3, 4) 事务执行的结果等价与任意一种串行执行的结果(否则 T1 和 T2 有一个事务的读操作不会读到空值)
    enhancement 
    opened by Tsunaou 0
  • Fix when creating SEQUENCE, it is mistaken for creating a package

    Fix when creating SEQUENCE, it is mistaken for creating a package

    Repair When creating a SEQUENCE, if the SEQUENCE name contains' package ', it is mistaken for creating a package statement under psql。 if the SEQUENCE name contains' function ' or 'procedure' is the same. e.g. CREATE SEQUENCE public.ecologypackageinfo_id_seq AS integer START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;

    opened by xiepeng38616 0
  • Failed to create procedure with $xxxxxx$ in psql

    Failed to create procedure with $xxxxxx$ in psql

    Bug Report

    If the logical identifier of procedure is "$xxxxxx$", creation fails. If it is $$, it is created. But in PostgreSQL 14.5, both of the above cases can be created successfully.

    IvorySQL Version

    All versions(1.1~1.5)

    OS Version (uname -a)

    Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

    Configuration options ( config.status --config )

    compatible_mode = postgres

    Current Behavior

    Test SQL: The logical identifier of procedure is "$body$".

    create or replace procedure proc_test_outpara(vid in integer, ov1 out varchar)
    language plpgsql
    as
    $body$
    declare
    begin
        if vid = 1 then
            ov1 = 'OK';
        else
            ov1 = 'NG';
        end if;
    end;
    $body$;
    

    Test result: IvorySQL 1.5: create fail image

    PostgreSQL 14.5: create success image

    Expected behavior

    Consistent with PG14.5, the procedure with "$xxxxxx$" is also created successfully.

    bug 
    opened by liuxintang 0
Releases(Ivory_REL_2_1)
DB Browser for SQLite (DB4S) is a high quality, visual, open source tool to create, design, and edit database files compatible with SQLite.

DB Browser for SQLite What it is DB Browser for SQLite (DB4S) is a high quality, visual, open source tool to create, design, and edit database files c

null 17.5k Jan 2, 2023
MySQL Server, the world's most popular open source database, and MySQL Cluster, a real-time, open source transactional database.

Copyright (c) 2000, 2021, Oracle and/or its affiliates. This is a release of MySQL, an SQL database server. License information can be found in the

MySQL 8.6k Dec 26, 2022
The official C++ client API for PostgreSQL.

libpqxx Welcome to libpqxx, the C++ API to the PostgreSQL database management system. Home page: http://pqxx.org/development/libpqxx/ Find libpqxx on

Jeroen Vermeulen 718 Jan 3, 2023
YugabyteDB is a high-performance, cloud-native distributed SQL database that aims to support all PostgreSQL features

YugabyteDB is a high-performance, cloud-native distributed SQL database that aims to support all PostgreSQL features. It is best to fit for cloud-native OLTP (i.e. real-time, business-critical) applications that need absolute data correctness and require at least one of the following: scalability, high tolerance to failures, or globally-distributed deployments.

yugabyte 7.4k Jan 7, 2023
A PostgreSQL extension providing an async networking interface accessible via SQL using a background worker and curl.

pg_net is a PostgreSQL extension exposing a SQL interface for async networking with a focus on scalability and UX.

Supabase 49 Dec 14, 2022
A framework to monitor and improve the performance of PostgreSQL using Machine Learning methods.

pg_plan_inspector pg_plan_inspector is being developed as a framework to monitor and improve the performance of PostgreSQL using Machine Learning meth

suzuki hironobu 198 Dec 27, 2022
Prometheus exporter for PostgreSQL

pgexporter pgexporter is a Prometheus exporter for PostgreSQL. pgexporter will connect to one or more PostgreSQL instances and let you monitor their o

null 19 Dec 22, 2022
PostgreSQL extension for pgexporter

pgexporter_ext pgexporter_ext is an extension for PostgreSQL to provide additional Prometheus metrics for pgexporter. Features Disk space metrics See

null 4 Apr 13, 2022
The PostgreSQL client API in modern C++

C++ client API to PostgreSQL {#mainpage} Dmitigr Pgfe (PostGres FrontEnd, hereinafter referred to as Pgfe) - is a C++ client API to PostgreSQL servers

Dmitry Igrishin 137 Dec 14, 2022
A friendly and lightweight C++ database library for MySQL, PostgreSQL, SQLite and ODBC.

QTL QTL is a C ++ library for accessing SQL databases and currently supports MySQL, SQLite, PostgreSQL and ODBC. QTL is a lightweight library that con

null 173 Dec 12, 2022
C++ client library for PostgreSQL

Welcome to taoPQ taoPQ is a lightweight C++ client library for accessing a PostgreSQL➚ database. It has no dependencies beyond libpq➚, the C applicati

The Art of C++ 232 Dec 22, 2022
Backup / restore solution for PostgreSQL

pgmoneta pgmoneta is a backup / restore solution for PostgreSQL. pgmoneta is named after the Roman Goddess of Memory. Features Full backup Restore Sym

null 41 Dec 22, 2022
recovery postgresql table data by update/delete/rollback/dropcolumn command

recovery postgresql table data by update/delete/rollback/dropcolumn command

RadonDB 6 Aug 4, 2022
pgagroal is a high-performance protocol-native connection pool for PostgreSQL.

pgagroal is a high-performance protocol-native connection pool for PostgreSQL.

Agroal 555 Dec 27, 2022
xxhash functions for PostgreSQL

pg_xxhash PostgreSQL ❤️ xxhash Tested with xxhash 0.8.1 and PostgreSQL 14.1 on Linux and macOS. Think twice before even considering to use it in any s

Igor Hatarist 6 Oct 27, 2022
Distributed PostgreSQL as an extension

What is Citus? Citus is a PostgreSQL extension that transforms Postgres into a distributed database—so you can achieve high performance at any scale.

Citus Data 7.7k Dec 30, 2022
High-performance time-series aggregation for PostgreSQL

PipelineDB has joined Confluent, read the blog post here. PipelineDB will not have new releases beyond 1.0.0, although critical bugs will still be fix

PipelineDB 2.5k Dec 26, 2022
Reliable PostgreSQL Backup & Restore

pgBackRest Reliable PostgreSQL Backup & Restore Introduction pgBackRest aims to be a reliable, easy-to-use backup and restore solution that can seamle

pgBackRest 1.5k Dec 31, 2022
upstream module that allows nginx to communicate directly with PostgreSQL database.

About ngx_postgres is an upstream module that allows nginx to communicate directly with PostgreSQL database. Configuration directives postgres_server

RekGRpth 1 Apr 29, 2022