From: | Maciek Sakrejda <msakrejda(at)truviso(dot)com> |
---|---|
To: | Collin Peters <cpeters(at)intouchtechnology(dot)com> |
Cc: | pgsql-jdbc(at)postgresql(dot)org |
Subject: | Re: Problems with semicolon trying to create a trigger function via jdbc |
Date: | 2010-03-25 21:02:51 |
Message-ID: | 895e58dd1003251402t1d2a5ec9j6c3fe6dff87b7a0a@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-jdbc |
The parseQuery() method in QueryExecutorImpl breaks up a query if
you're executing more than one statement in a single JDBC query.
However, it seems to take quotes (and comments) into account. I tried
your simple test case (replacing DriverManager.getConnection() for
ds.getConnection()), and it works fine. I have a feeling that the
DataSource is wrapping the Connection (and Statement) in proxies that
also try to break up the individual queries, but that do not take
dollar-quotes into account.
---
Maciek Sakrejda | Software Engineer | Truviso
1065 E. Hillsdale Blvd., Suite 230
Foster City, CA 94404
(650) 242-3500 Main
(650) 242-3501 F
msakrejda(at)truviso(dot)com
www.truviso.com
On Thu, Mar 25, 2010 at 1:19 PM, Collin Peters
<cpeters(at)intouchtechnology(dot)com> wrote:
> Hi all,
>
> I have some framework code that needs to dynamically generate a
> function. There seems to be a problem where the SQL gets truncated at
> the first semicolon encountered in the function. I have tried this
> with a very simple function and duplicated it.
>
> The test trigger function is as follows:
> CREATE OR REPLACE FUNCTION test()
> RETURNS trigger AS
> $BODY$
> DECLARE
> foo integer;
> BEGIN
> foo = 4;
> RAISE NOTICE 'Foo: %', foo;
> END;
> $BODY$
> LANGUAGE 'plpgsql' VOLATILE
> COST 100;
> ALTER FUNCTION test() OWNER TO mcrtdbms;
>
> The simple test code is:
> String sql = "CREATE OR REPLACE FUNCTION
> history.history_insert_trigger() RETURNS trigger AS $BODY$
> DECLARE foo integer; BEGIN foo = 4; RAISE NOTICE 'Foo: %', foo;
> END; $BODY$ LANGUAGE 'plpgsql' VOLATILE; ";
> DataSource ds = getDataSource();
> try
> {
> Connection conn = ds.getConnection();
> conn.setAutoCommit(true);
> Statement st = conn.createStatement();
> st.executeUpdate(sql);
> st.close();
> conn.close();
> }
> catch (SQLException e)
> {
> e.printStackTrace();
> }
>
> When I try to run this via my webapp I get the error:
> org.postgresql.util.PSQLException: ERROR: unterminated dollar-quoted
> string at or near "$BODY$ DECLARE foo integer"
> at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1591)
> at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1340)
> at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192)
> <snip>
>
> So it seems to be truncating the SQL at the first semicolon it
> encounters which, of course, borks the whole thing. What is even
> stranger in my quest to get this working is that the above code
> actually WORKS when I run it through a JUnit test!!! I have made no
> progress in trying to figure out what is different between the unit
> test and the running webapp. At first I though it was my ORM so I
> tried with the straight JDBC code used above and so eliminated that.
> Now I am trying to determine if the Postgres JDBC driver is at fault.
>
> Here is the rest of the details
> * JDBC version 8.3-605 JDBC 3
> * Postgres 8.3
> * JUnit 4
> * Application is built w/ Spring (but this manual query shouldn't be
> affected by taht)
> * When the above query is run through the webapp, it is initially
> triggered by a Quartz (scheduling api) trigger (which runs when the
> webapp starts)
>
> Any help at all would be appreciated!! I am about to give up and
> write a function which will do the job of creating the trigger for
> me!!
>
> Regards,
> Collin
>
> --
> Sent via pgsql-jdbc mailing list (pgsql-jdbc(at)postgresql(dot)org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-jdbc
>
From | Date | Subject | |
---|---|---|---|
Next Message | Collin Peters | 2010-03-25 21:43:56 | Re: Problems with semicolon trying to create a trigger function via jdbc |
Previous Message | Tom Lane | 2010-03-25 21:00:22 | Re: Problems with semicolon trying to create a trigger function via jdbc |