Обсуждение: how to handle data containing '\0'

Поиск
Список
Период
Сортировка

how to handle data containing '\0'

От
"EBIHARA, Yuichiro"
Дата:
Hi experts,

I need to handle String data containing '\0' in my Java + JDBC program. Such data can happen at other systems and be
sentto 
PostgreSQL. Here is a sample to simulate it in Java code.

        char c = '\0';
        String val = "abc" + c + "def";

Now I have to support two versions of drivers, 7.4 and 8.1, but the behavior of driver depends on versions when I
insertthis String 
value.

=== pg74.216.jdbc3.jar ===
java.lang.IllegalArgumentException: \0 not allowed
    at org.postgresql.jdbc1.AbstractJdbc1Statement.escapeString(AbstractJdbc1Statement.java:1152)
    at org.postgresql.jdbc1.AbstractJdbc1Statement.setString(AbstractJdbc1Statement.java:1133)
    at org.postgresql.jdbc1.AbstractJdbc1Statement.setString(AbstractJdbc1Statement.java:1116)
    at Bug5391.main(Bug5391.java:24)

=== postgresql-8.1-405.jdbc3.jar ===
Successfully finished without exception but the string is truncated at '\0' and only the first three characters, "abc",
isinserted. 
(I verified this with psql on the server side)

I understand the current protocol does not allow '\0' in String and basically I should remove '\0' before I try to
insertbut I and 
team members may forget it somewhere. I'm feeling the 8.1 behavior is worse than 7.4 because user data is truncated
withoutnotice. 
For the sample above, I expect "abcdef" rather than "abc".

What do you think about this?
My idea is to introduce new connection parameter to determine how to behave against '\0'.
Options may be

 - throws an exception
 - truncates at '\0'
 - removes '\0'

Thanks,

ebi



Re: how to handle data containing '\0'

От
Marc Herbert
Дата:
"EBIHARA, Yuichiro" <ebihara@iplocks.co.jp> writes:

>
> I need to handle String data containing '\0' in my Java + JDBC program. Such data can happen at other systems and be
sentto 
> PostgreSQL. Here is a sample to simulate it in Java code.

As far as I know, it is not possible to store such strings in a
postgreSQL database (whatever the client interface used). The reason
seems to be that postgreSQL is written in C, and most C functions use
\0 as a string terminator.


Re: how to handle data containing '\0'

От
"Larry Rosenman"
Дата:
Marc Herbert wrote:
> "EBIHARA, Yuichiro" <ebihara@iplocks.co.jp> writes:
>
>>
>> I need to handle String data containing '\0' in my Java + JDBC
>> program. Such data can happen at other systems and be sent to
>> PostgreSQL. Here is a sample to simulate it in Java code.
>
> As far as I know, it is not possible to store such strings in a
> postgreSQL database (whatever the client interface used). The reason
> seems to be that postgreSQL is written in C, and most C functions use
> \0 as a string terminator.
>
the bytea datatype handles such strings.

LER

--
Larry Rosenman
Database Support Engineer

PERVASIVE SOFTWARE. INC.
12365B RIATA TRACE PKWY
3015
AUSTIN TX  78727-6531

Tel: 512.231.6173
Fax: 512.231.6597
Email: Larry.Rosenman@pervasive.com
Web: www.pervasive.com

Re: how to handle data containing '\0'

От
"EBIHARA, Yuichiro"
Дата:
Thank you for your quick response.

I understand '\0' cannot be stored in VARCHAR/CHAR columns.
I just wonder whether JDBC driver should truncate String without notice or not. Throwing exception is understandable
butthe 
behavior was changed in 8.1.

This may be a compatibility issue.

Thanks,

ebi

> -----Original Message-----
> From: pgsql-jdbc-owner@postgresql.org
> [mailto:pgsql-jdbc-owner@postgresql.org] On Behalf Of Larry Rosenman
> Sent: Wednesday, May 17, 2006 10:48 PM
> To: Marc Herbert; pgsql-jdbc@postgresql.org
> Subject: Re: [JDBC] how to handle data containing '\0'
>
>
> Marc Herbert wrote:
> > "EBIHARA, Yuichiro" <ebihara@iplocks.co.jp> writes:
> >
> >>
> >> I need to handle String data containing '\0' in my Java + JDBC
> >> program. Such data can happen at other systems and be sent to
> >> PostgreSQL. Here is a sample to simulate it in Java code.
> >
> > As far as I know, it is not possible to store such strings in a
> > postgreSQL database (whatever the client interface used).
> The reason
> > seems to be that postgreSQL is written in C, and most C
> functions use
> > \0 as a string terminator.
> >
> the bytea datatype handles such strings.
>
> LER
>
> --
> Larry Rosenman
> Database Support Engineer
>
> PERVASIVE SOFTWARE. INC.
> 12365B RIATA TRACE PKWY
> 3015
> AUSTIN TX  78727-6531
>
> Tel: 512.231.6173
> Fax: 512.231.6597
> Email: Larry.Rosenman@pervasive.com
> Web: www.pervasive.com
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 9: In versions below 8.0, the planner will ignore your desire to
>        choose an index scan if your joining column's datatypes do not
>        match
>
>
>



Re: how to handle data containing '\0'

От
Kris Jurka
Дата:

On Wed, 17 May 2006, EBIHARA, Yuichiro wrote:

> I need to handle String data containing '\0' in my Java + JDBC program.
>
> Now I have to support two versions of drivers, 7.4 and 8.1, but the
> behavior of driver depends on versions when I insert this String value.
>

This was changed between 7.4 and 8.0 when prepared statements changed from
dynamically creating a sql string from the parameters to passing the
parameters separately.  When creating a sql string the parameters had to
be carefully checked for ' and \ so checking for \0 was also done.  When
passing the parameters separately there is no need for the ' and \ checks
so the \0 check was removed as well either unintentionally or for
perfomance reasons.

New server releases for all versions will be out this week that fix the
problem on the server side by explicitly rejecting \0 rather than
truncating.

Kris Jurka


Re: how to handle data containing '\0'

От
"EBIHARA, Yuichiro"
Дата:
Thanks, Kris.

I understand the behavior is server-side issue, not JDBC, and we are to be forced to explicitely remove '\0' with the
latestserver 
releases.

It's not necessarily the best for me but better than now.

Finally, do you know the thread containing the discussion that triggered the change of server behavior?

Thanks,

ebi

> -----Original Message-----
> From: Kris Jurka [mailto:books@ejurka.com]
> Sent: Monday, May 22, 2006 4:29 PM
> To: EBIHARA, Yuichiro
> Cc: pgsql-jdbc@postgresql.org
> Subject: Re: [JDBC] how to handle data containing '\0'
>
>
>
>
> On Wed, 17 May 2006, EBIHARA, Yuichiro wrote:
>
> > I need to handle String data containing '\0' in my Java + JDBC
> > program.
> >
> > Now I have to support two versions of drivers, 7.4 and 8.1, but the
> > behavior of driver depends on versions when I insert this
> String value.
> >
>
> This was changed between 7.4 and 8.0 when prepared statements
> changed from
> dynamically creating a sql string from the parameters to passing the
> parameters separately.  When creating a sql string the
> parameters had to
> be carefully checked for ' and \ so checking for \0 was also
> done.  When
> passing the parameters separately there is no need for the '
> and \ checks
> so the \0 check was removed as well either unintentionally or for
> perfomance reasons.
>
> New server releases for all versions will be out this week
> that fix the
> problem on the server side by explicitly rejecting \0 rather than
> truncating.
>
> Kris Jurka
>
>
>
>



Re: how to handle data containing '\0'

От
Kris Jurka
Дата:

On Mon, 22 May 2006, EBIHARA, Yuichiro wrote:

> I understand the behavior is server-side issue, not JDBC, and we are to
> be forced to explicitely remove '\0' with the latest server releases.
>
> It's not necessarily the best for me but better than now.
>
> Finally, do you know the thread containing the discussion that triggered
> the change of server behavior?
>

Original thread starts here:
http://archives.postgresql.org/pgsql-hackers/2006-02/msg00743.php

Commit message here:
http://archives.postgresql.org/pgsql-committers/2006-05/msg00206.php

Kris Jurka