From: | Collin Peters <cpeters(at)intouchtechnology(dot)com> |
---|---|
To: | Maciek Sakrejda <msakrejda(at)truviso(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:43:56 |
Message-ID: | 7a8b7ba31003251443v74fe6df1mc412e0c03ba4cf3c@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-jdbc |
Thanks for the replies Tom and Maciek,
I wasn't able to get the DriverManager.getConnection() approach to
work (still worked in the unit test, but not the running webapp), but
reverting to the old 'non-dollar' quoting approach worked.
Thanks
Collin
On Thu, Mar 25, 2010 at 2:02 PM, Maciek Sakrejda <msakrejda(at)truviso(dot)com> wrote:
> 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 | Maciek Sakrejda | 2010-03-25 22:30:21 | Re: Problems with semicolon trying to create a trigger function via jdbc |
Previous Message | Maciek Sakrejda | 2010-03-25 21:02:51 | Re: Problems with semicolon trying to create a trigger function via jdbc |