Re: Bug in AbstracJdbc2Statement.replaceProcessing when using dollar quoting? - Mailing list pgsql-jdbc

From Dave Cramer
Subject Re: Bug in AbstracJdbc2Statement.replaceProcessing when using dollar quoting?
Date
Msg-id CADK3HHJVdWXx6kr0fHF8mc0Tq8__BXDV0M-PjC31C+f+-i6tVA@mail.gmail.com
Whole thread Raw
In response to Bug in AbstracJdbc2Statement.replaceProcessing when using dollar quoting?  (GEISINGER Marc - Contractor <Marc.GEISINGER@external.thalesgroup.com>)
Responses Re: Bug in AbstracJdbc2Statement.replaceProcessing when using dollar quoting?  ("David Johnston" <polobo@yahoo.com>)
List pgsql-jdbc
David,

Thanks for the summary, I understand the problem now. I had a look at
the code and the current parser basically looks at 1 character to
determine state. Having to look at N characters to look at state will
be a significant amount of work.I'd certainly welcome a patch.

Dave Cramer

dave.cramer(at)credativ(dot)ca
http://www.credativ.ca


On Mon, Sep 24, 2012 at 8:55 AM, David Johnston <polobo@yahoo.com> wrote:
> Marc,
>
> Since you have gotten this far, and seem to understand the issue fairly
> well, are you in a position to contribute back to the project and submit a
> patch for the community to review and hopefully apply that will implement
> this feature?
>
> Even if the community agrees on the merits of the feature someone will still
> have to take time to actually implement it.  It is not a bug, contrary to
> your claims, for the reasons I've stated before and the impact of the
> behavior on the community seems negligible since no one has bothered to
> implement this and it has been around pretty much since day one.  Most
> people likely just turn off JDBC escape processing as being not worth the
> hassle.
>
> I'm actually considered doing it myself (the patch) but the better solution
> for me is to do just that (turn off escaping) and given my own priorities
> that is what I am going to do for now.
>
> @Dave Cramer
> The main reason for turning off processing, and not just treating
> dollar-quoting as a string literal, is to try and help any developer who do
> wants to code generically using JDBC escapes but inadvertently uses
> dollar-quoting.  In that situation their attempt is going to fail on all
> other databases and thus it should arguably fail on PostgreSQL as well.  The
> solution for them is to use normal quoting if they want to use JDBC escaping
> or forgo escaping if they want to use dollar-quoting.  Enabling both has
> some merit but IMO it makes the driver to forgiving in the face of
> ambiguity.  That said there are transition concerns to be discussed.  Also,
> a flag to raise some form of warning if an escape sequence is found inside
> dollar-quoting is probably worthwhile as well.  That should help in
> identifying problem SQL in existing "static" code.
>
> David J.
>
>> -----Original Message-----
>> From: GEISINGER Marc - Contractor
>> [mailto:Marc.GEISINGER@external.thalesgroup.com]
>> Sent: Monday, September 24, 2012 7:54 AM
>> To: Dave Cramer
>> Cc: David Johnston; pgsql-jdbc@postgresql.org
>> Subject: AW: [JDBC] Bug in AbstracJdbc2Statement.replaceProcessing when
>> using dollar quoting?
>>
>> Hi Dave,
>> The comment i am refering to is in
>> org.postgresql.jdbc2.AbstractJdbc2Statement and it says:
>>
>>     /*
>>      * Filter the SQL string of Java SQL Escape clauses.
>>      *
>>      * Currently implemented Escape clauses are those mentioned in 11.3
>>      * in the specification. Basically we look through the sql string for
>>      * {d xxx}, {t xxx}, {ts xxx}, {oj xxx} or {fn xxx} in non-string sql
>>      * code. When we find them, we just strip the escape part leaving only
>>      * the xxx part.
>>      * So, something like "select * from x where d={d '2001-10-09'}" would
>>      * return "select * from x where d= '2001-10-09'".
>>      */
>>     protected String replaceProcessing(String p_sql) throws SQLException
>>
>> And I don't want escape processing to be turned off just for me, I just
> want
>> dollar quoted strings to be treated the same as strings in single quotes
> would
>> be. In the replaceProcessing method there is another comment:
>>
>> // Since escape codes can only appear in SQL CODE, we keep track // of if
> we
>> enter a string or not.
>>
>> Everything between dollar quotes is not sql code.
>>
>> Marc
>>
>> -----Ursprüngliche Nachricht-----
>> Von: davecramer@gmail.com [mailto:davecramer@gmail.com] Im Auftrag
>> von Dave Cramer
>> Gesendet: Montag, 24. September 2012 13:42
>> An: GEISINGER Marc - Contractor
>> Cc: David Johnston; pgsql-jdbc@postgresql.org
>> Betreff: Re: [JDBC] Bug in AbstracJdbc2Statement.replaceProcessing when
>> using dollar quoting?
>>
>> Marc,
>>
>> Where is this comment you are referring to ? What I suspect you want is
>> once a dollar quote is found you want escape processing to be turned off?
>> What do I do with the next guy who wants it back on ?
>>
>>
>> Dave Cramer
>>
>> dave.cramer(at)credativ(dot)ca
>> http://www.credativ.ca
>>
>>
>> On Mon, Sep 24, 2012 at 6:43 AM, GEISINGER Marc - Contractor
>> <Marc.GEISINGER@external.thalesgroup.com> wrote:
>> > Hi Dave,
>> > I don't want this feature removed. I just would like to see this fixed
> so that
>> dollar quoted strings are correctly seen as strings, and therefor without
> sql
>> escape clauses replacing. Like the comment for replaceProcessing says
> "look
>> through non-string sql code". Dollar quoted strings are strings for
> postgresql.
>> >
>> > Marc
>> >
>> > -----Ursprüngliche Nachricht-----
>> > Von: davecramer@gmail.com [mailto:davecramer@gmail.com] Im Auftrag
>> von
>> > Dave Cramer
>> > Gesendet: Montag, 24. September 2012 11:28
>> > An: GEISINGER Marc - Contractor
>> > Cc: David Johnston; pgsql-jdbc@postgresql.org
>> > Betreff: Re: [JDBC] Bug in AbstracJdbc2Statement.replaceProcessing when
>> using dollar quoting?
>> >
>> > Marc,
>> >
>> > I haven't had time to look at this in detail but I suspect that what
>> > is happening is that a JDBC *feature* which is here
>> >
>> http://docs.oracle.com/cd/E13157_01/wlevs/docs30/jdbc_drivers/sqlescap
>> > e.html explains why {d} is replaced by DATE. I'm not sure how you
>> > would like to see this fixed ? This is the JBDC spec, replace {d} with
> DATE. As
>> someone suggested, turn escape processing off and it will work fine.
>> >
>> >
>> > dave.cramer(at)credativ(dot)ca
>> > http://www.credativ.ca
>> >
>> >
>> > On Mon, Sep 24, 2012 at 3:13 AM, GEISINGER Marc - Contractor
>> <Marc.GEISINGER@external.thalesgroup.com> wrote:
>> >> Hi,
>> >> when using dollar quoting in my statements I knew it would be
> postgresql
>> specific. That was ok since our project isn't likely to be ported to
> another db.
>> It wasn't meant to be multiy db platform compatible. If anybody want's to
>> write dbms independent code, I wouldn't think to find dollar quoting
> there.
>> >>
>> >> I don't know how the jdbc driver development is done, and how platform
>> specific features are handled there. But as it is a documented postgresql
>> feature and it is understood by PgAdmin itself (and other postgresql
> drivers),
>> I think the postgresql jdbc driver should be able to do it too.
>> >> I also don't think it is needed to make it work with other jdbc
> drivers, but
>> that might be out of my scope.
>> >>
>> >> Marc
>> >>
>> >> -----Ursprüngliche Nachricht-----
>> >> Von: David Johnston [mailto:polobo@yahoo.com]
>> >> Gesendet: Freitag, 21. September 2012 18:43
>> >> An: GEISINGER Marc - Contractor; 'Dave Cramer'
>> >> Cc: pgsql-jdbc@postgresql.org
>> >> Betreff: RE: [JDBC] Bug in AbstracJdbc2Statement.replaceProcessing
>> when using dollar quoting?
>> >>
>> >> All the following said would it be within the realm of acceptability to
> test
>> the query for dollar-quoting and, if found, to automatically disable JDBC
>> escape mode?
>> >>
>> >> The presence of dollar-quoting in a PostgreSQL driver is something that
> is
>> likely to occur and when it does the user should hopefully understand that
>> any JDBC escaping isn't going to guarantee the portability that is implied
> by its
>> presence.  It would seem to be a newbie friendly way of making things work
>> given the escaping is on by default and for someone not as familiar with
> JDBC
>> features as they are PostgreSQL features the risk posed by the
> combination,
>> while minimal, would be mostly invisible (since it would not generate
> syntax
>> errors directly but would rather simply store invalid data).
>> >>
>> >> David J.
>> >>
>> >>
>> >>> -----Original Message-----
>> >>> From: pgsql-jdbc-owner@postgresql.org [mailto:pgsql-jdbc-
>> >>> owner@postgresql.org] On Behalf Of David Johnston
>> >>> Sent: Friday, September 21, 2012 12:22 PM
>> >>> To: 'GEISINGER Marc - Contractor'; 'Dave Cramer'
>> >>> Cc: pgsql-jdbc@postgresql.org
>> >>> Subject: Re: [JDBC] Bug in AbstracJdbc2Statement.replaceProcessing
>> >>> when using dollar quoting?
>> >>>
>> >>> > -----Original Message-----
>> >>> >
>> >>> > Hi Dave,
>> >>> > in the potsgresql documentation it says:
>> >>> >
>> >>> >
>> >>> > And that is excactly what i am trying to do. An easy and safe way
>> >>> > to
>> >>> escape
>> >>> > strings that are coming from "outside". And since I tried it and
>> >>> > it worked
>> >>> with
>> >>> > PgAdmin, i expect it to be a way that can be used.
>> >>> >
>> >>> >
>> >>> > To Victor:
>> >>> > And I cannot just setEnableProcessing to false. The code I've
>> >>> > posted here
>> >>> is
>> >>> > just an example code. The code where I came to this problem is not
>> >>> > that simple. And I would have to either disable it completely or
>> >>> > not at all (we
>> >>> are
>> >>> > using an ORM framework for db access). Since reading the above I
>> >>> > think
>> >>> this
>> >>> > is a thing that should be fixed in the driver I don't want to
>> >>> > completely
>> >>> block
>> >>> > SQL escape clauses in my code (even though i never used them
>> >>> > myself
>> >>> > :)
>> >>> > )
>> >>> >
>> >>> >
>> >>> > Can you show me where in the spec it says you can use dollar sign
>> >>> > quoting like that ?
>> >>> >
>> >>>
>> >>> So:
>> >>>
>> >>> Dollar-quoting is PostgreSQL specific and if used with any other
>> >>> database
>> >> the
>> >>> query will likely fail.
>> >>>
>> >>> The JDBC escape mechanism is defined to allow for cross-vendor query
>> >>> writing.
>> >>>
>> >>> In order for the JDBC escape mechanism to serve its purpose it would
>> >>> have to recognize dollar-quoting generally and convert it into
>> >>> whatever string delimiting mechanism its server is familiar with
>> >>> (i.e., back to
>> >> single-quote and
>> >>> quote escaping) in order to serve its function.
>> >>>
>> >>> If it simply accepts dollar-quoting but does not convert it when
>> >>> necessary then queries using the escapes will fail anyway when put
>> >>> to a database not supporting dollar-quoting.  While the PostgreSQL
>> >>> driver could indeed do
>> >> this
>> >>> properly it does not mean that the, for example, Oracle and
>> >>> SQLServer drivers out there are going to perform the conversion
>> >>> since it is not
>> >> required
>> >>> of them in the JDBC specification.
>> >>>
>> >>> The decision of whether to allow escaping by default is project
>> >>> specific
>> >> but
>> >>> regardless of the default decision the driver and whatever interface
>> >>> your ORM provides should allow you to make the decision on a per-
>> query basis.
>> >>>
>> >>> The main risk I can see with using dollar-quoting and having
>> >>> escaping
>> >> enabled
>> >>> is if the strings in question use the obscure escape syntax for some
>> >> reason
>> >>> (unlikely) then the string valued stored is going to be messed up
>> >>> but otherwise PostgreSQL will still treat it as a string.  I have in
>> >>> fact been
>> >> living
>> >>> with this for quite a while (when I store and execute CREATE
>> >>> FUNCTION) and haven't had any clobbering.  The question to ask
>> >>> yourself is whether that risk window is large enough to warrant
>> >>> modifying your execution environment.
>> >>>
>> >>> You need to decide whether all of your code is supposedly
>> >>> vendor-neutral and so you can leave escaping on and ignore
>> >>> dollar-quoting OR you can code in a strictly literal syntax and
>> >>> disable escaping.  If you want to live in
>> >> both
>> >>> worlds then you need to be able to tell your execution environment
>> >>> which world you are living in for each query you write.
>> >>>
>> >>> David J.
>> >>>
>> >>>
>> >>>
>> >>>
>> >>>
>> >>>
>> >>> --
>> >>> Sent via pgsql-jdbc mailing list (pgsql-jdbc@postgresql.org) To make
>> >> changes
>> >>> to your subscription:
>> >>> http://www.postgresql.org/mailpref/pgsql-jdbc
>> >>
>


pgsql-jdbc by date:

Previous
From: Dave Cramer
Date:
Subject: Re: Bug in AbstracJdbc2Statement.replaceProcessing when using dollar quoting?
Next
From: "David Johnston"
Date:
Subject: Re: Bug in AbstracJdbc2Statement.replaceProcessing when using dollar quoting?