Bug? {? = CALL insert_page_segment (?, ?)} - Mailing list pgsql-odbc

From Nils Gösche
Subject Bug? {? = CALL insert_page_segment (?, ?)}
Date
Msg-id 002701cffdd2$0f2842d0$2d78c870$@cartan.de
Whole thread Raw
Responses Re: Bug? {? = CALL insert_page_segment (?, ?)}  ("Inoue, Hiroshi" <inoue@tpf.co.jp>)
List pgsql-odbc
Hi!

I have a problem with newer versions of the ODBC driver. I made a small
testing example to reproduce the problem:

The following code works fine with version 09.02.0100 of the driver. With
09.03.0210, it crashes. With 09.03.0400, I get a strange exception and error
message.

This is all on Windows, 32-Bit. I tried Windows 7 and Windows 8.1; I also
tried Postgres versions 9.2.4, 9.2.9, 9.3.4 and 9.3.5, all 32-Bit.

Here is the create script for the database:

CREATE TABLE page_segments (
    task_id uuid,
    id uuid,
    PRIMARY KEY (task_id, id)
);

CREATE FUNCTION insert_page_segment(theTaskId uuid, theId uuid) RETURNS int
AS $$
DECLARE
    ret int NOT NULL := 0;
BEGIN
    BEGIN
        INSERT INTO page_segments (task_id, id) VALUES (theTaskId,
theId);
        ret := 1;
    EXCEPTION WHEN unique_violation THEN
        -- ignore
    END;
    RETURN ret;
END
$$ LANGUAGE plpgsql;

And here is some C# code that calls the insert_page_segment function:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.Odbc;

namespace ODBCTest
{
    class Program
    {
        const string ConnString = @"Driver={PostgreSQL
Unicode};server=localhost;port=5432;database=stringtest;uid=cartan;pwd=...";
        static void Main(string[] args)
        {
            using (var conn = new OdbcConnection(ConnString))
            {
                conn.Open();
                Guid g1 = Guid.NewGuid();
                Guid g2 = Guid.NewGuid();
                Console.WriteLine("First call returns {0}",
CallTheFunc(conn, g1, g2));
            }
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey(true);
        }

        static int CallTheFunc(OdbcConnection conn, Guid taskId, Guid id)
        {
            using (var trans = conn.BeginTransaction())
            {
                try
                {
                    const string insertCmdText = @"{? = CALL
insert_page_segment (?, ?)}";
                    using (var insertCmd = new OdbcCommand(insertCmdText,
conn, trans))
                    {
                        var retParam = new OdbcParameter();
                        retParam.OdbcType = OdbcType.Int;
                        retParam.Direction = ParameterDirection.ReturnValue;
                        insertCmd.Parameters.Add(retParam);

                        var taskIdParam = new OdbcParameter();
                        taskIdParam.OdbcType = OdbcType.UniqueIdentifier;
                        taskIdParam.Value = taskId;
                        insertCmd.Parameters.Add(taskIdParam);

                        var idParam = new OdbcParameter();
                        idParam.OdbcType = OdbcType.UniqueIdentifier;
                        idParam.Value = id;
                        insertCmd.Parameters.Add(idParam);

                        insertCmd.ExecuteNonQuery();
                        int ret = (int) retParam.Value;

                        trans.Commit();
                        return ret;
                    }
                }
                catch
                {
                    trans.Rollback();
                    throw;
                }
            }
        }
    }
}

With the old 9.2.1 driver, the function just returns 1 as expected. With
9.3.4, I get an unusual InvalidOperationException in ExecuteNonQuery(),
saying

  "This OdbcTransaction has completed; it is no longer usable."

In the Postgres log file, I find this message:

2014-11-11 17:26:04 CET ERROR:  function insert_page_segment(unknown) does
not exist at character 8
2014-11-11 17:26:04 CET HINT:  No function matches the given name and
argument types. You might need to add explicit type casts.
2014-11-11 17:26:04 CET STATEMENT:  SELECT insert_page_segment ($1, $2)
2014-11-11 17:26:04 CET FATAL:  invalid frontend message type 0

Can anybody help me with this?

Regards,
--
Nils Gösche
Don’t ask for whom the <Ctrl-G> tolls.




pgsql-odbc by date:

Previous
From: Adrian Klaver
Date:
Subject: Re: Connection string parameter "sslrootcert" does not work
Next
From: Ed Hutchinson
Date:
Subject: Re: Connection string parameter "sslrootcert" does not work