Обсуждение: Retrieving bytea column problem - they're are sometimes truncated
G'day all,
I've been hacking at this all day and have now been through my source and
then the driver source - grokking the entire postgres jdbc driver in the
process ;)
What happens is when I store binary content into a bytea field it works fine
(using setBinaryStream() or setBytes()). I've tested this by looking into
the DB at the actual content itself.
However when I retrive the content, it's sometimes truncated. (It appears to
be for content greater than about 25k but that's a very rough
approximation).
here's a snippet of my debugging code:
org.postgresql.jdbc2.ResultSet.java
if (fields[columnIndex - 1].getPGType().equals("bytea"))
{
String s = getString(columnIndex);
System.out.println("s = " + s);
byte[] result = PGbytea.toBytes(s);
System.out.println("result.length = " + result.length);
return result;
}
the result.length returned (in one example) is 59402 bytes, when the length
of the bytea field is actually 190608 bytes.
printing s to the console indeed reveals that it has been truncated.
(As a test I inserted a list of a few thousand emails addresses in order,
starting from a-z - it gets truncated around f - although the DB has all the
way through to z ;))
I looked deeper into the source for about 30 minutes but got a little lost
in pg_stream in QueryExecutor and figured I'd leave the rest of the
investigation up to the experts!
I couldn't find any related queries in the archives.
Can anyone help? Or provide insight as to where I should start looking?
Cheers,
Mike
Mike Cannon-Brookes :: mike@atlassian.com
Atlassian :: http://www.atlassian.com
Supporting YOUR J2EE World
Mike,
Which version of the database and drivers are you running?
thanks,
--Barry
Mike Cannon-Brookes wrote:
> G'day all,
>
> I've been hacking at this all day and have now been through my source and
> then the driver source - grokking the entire postgres jdbc driver in the
> process ;)
>
> What happens is when I store binary content into a bytea field it works fine
> (using setBinaryStream() or setBytes()). I've tested this by looking into
> the DB at the actual content itself.
>
> However when I retrive the content, it's sometimes truncated. (It appears to
> be for content greater than about 25k but that's a very rough
> approximation).
>
> here's a snippet of my debugging code:
>
> org.postgresql.jdbc2.ResultSet.java
>
> if (fields[columnIndex - 1].getPGType().equals("bytea"))
> {
> String s = getString(columnIndex);
> System.out.println("s = " + s);
> byte[] result = PGbytea.toBytes(s);
> System.out.println("result.length = " + result.length);
> return result;
> }
>
> the result.length returned (in one example) is 59402 bytes, when the length
> of the bytea field is actually 190608 bytes.
>
> printing s to the console indeed reveals that it has been truncated.
>
> (As a test I inserted a list of a few thousand emails addresses in order,
> starting from a-z - it gets truncated around f - although the DB has all the
> way through to z ;))
>
> I looked deeper into the source for about 30 minutes but got a little lost
> in pg_stream in QueryExecutor and figured I'd leave the rest of the
> investigation up to the experts!
>
> I couldn't find any related queries in the archives.
>
> Can anyone help? Or provide insight as to where I should start looking?
>
> Cheers,
> Mike
>
> Mike Cannon-Brookes :: mike@atlassian.com
>
> Atlassian :: http://www.atlassian.com
> Supporting YOUR J2EE World
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster
>
>
Re: Retrieving bytea column problem - they're are sometimes truncated
От
"Mike Cannon-Brookes"
Дата:
Barry,
Running postgres 7.1.3 and a freshly built driver from CVS.
-mike
> -----Original Message-----
> From: Barry Lind [mailto:barry@xythos.com]
> Sent: Sunday, November 18, 2001 7:46 AM
> To: mike@atlassian.com
> Cc: pgsql-jdbc@postgresql.org
> Subject: Re: Retrieving bytea column problem - they're are sometimes
> truncated
>
>
> Mike,
>
> Which version of the database and drivers are you running?
>
> thanks,
> --Barry
>
>
> Mike Cannon-Brookes wrote:
>
> > G'day all,
> >
> > I've been hacking at this all day and have now been through my
> source and
> > then the driver source - grokking the entire postgres jdbc driver in the
> > process ;)
> >
> > What happens is when I store binary content into a bytea field
> it works fine
> > (using setBinaryStream() or setBytes()). I've tested this by
> looking into
> > the DB at the actual content itself.
> >
> > However when I retrive the content, it's sometimes truncated.
> (It appears to
> > be for content greater than about 25k but that's a very rough
> > approximation).
> >
> > here's a snippet of my debugging code:
> >
> > org.postgresql.jdbc2.ResultSet.java
> >
> > if (fields[columnIndex - 1].getPGType().equals("bytea"))
> > {
> > String s = getString(columnIndex);
> > System.out.println("s = " + s);
> > byte[] result = PGbytea.toBytes(s);
> > System.out.println("result.length = " + result.length);
> > return result;
> > }
> >
> > the result.length returned (in one example) is 59402 bytes,
> when the length
> > of the bytea field is actually 190608 bytes.
> >
> > printing s to the console indeed reveals that it has been truncated.
> >
> > (As a test I inserted a list of a few thousand emails addresses
> in order,
> > starting from a-z - it gets truncated around f - although the
> DB has all the
> > way through to z ;))
> >
> > I looked deeper into the source for about 30 minutes but got a
> little lost
> > in pg_stream in QueryExecutor and figured I'd leave the rest of the
> > investigation up to the experts!
> >
> > I couldn't find any related queries in the archives.
> >
> > Can anyone help? Or provide insight as to where I should start looking?
> >
> > Cheers,
> > Mike
> >
> > Mike Cannon-Brookes :: mike@atlassian.com
> >
> > Atlassian :: http://www.atlassian.com
> > Supporting YOUR J2EE World
> >
> >
> >
> > ---------------------------(end of broadcast)---------------------------
> > TIP 4: Don't 'kill -9' the postmaster
> >
> >
>
>
>
Re: Retrieving bytea column problem - they're are sometimes truncated
От
"Mike Cannon-Brookes"
Дата:
Any ideas on this? Do I need to install 7.2 beta to use bytea columns? (I'm doubtful that would make a difference in this case). Can someone more knowledgeable about the driver internals point me to where I can start to debug inside QueryExectutor / pg_stream? -mike Mike Cannon-Brookes :: mike@atlassian.com Atlassian :: http://www.atlassian.com Supporting YOUR J2EE World > -----Original Message----- > From: pgsql-jdbc-owner@postgresql.org > [mailto:pgsql-jdbc-owner@postgresql.org]On Behalf Of Mike Cannon-Brookes > Sent: Sunday, November 18, 2001 9:44 AM > To: Barry Lind > Cc: pgsql-jdbc@postgresql.org > Subject: Re: [JDBC] Retrieving bytea column problem - they're are > sometimes truncated > > > Barry, > > Running postgres 7.1.3 and a freshly built driver from CVS. > > -mike > > > > -----Original Message----- > > From: Barry Lind [mailto:barry@xythos.com] > > Sent: Sunday, November 18, 2001 7:46 AM > > To: mike@atlassian.com > > Cc: pgsql-jdbc@postgresql.org > > Subject: Re: Retrieving bytea column problem - they're are sometimes > > truncated > > > > > > Mike, > > > > Which version of the database and drivers are you running? > > > > thanks, > > --Barry > > > > > > Mike Cannon-Brookes wrote: > > > > > G'day all, > > > > > > I've been hacking at this all day and have now been through my > > source and > > > then the driver source - grokking the entire postgres jdbc > driver in the > > > process ;) > > > > > > What happens is when I store binary content into a bytea field > > it works fine > > > (using setBinaryStream() or setBytes()). I've tested this by > > looking into > > > the DB at the actual content itself. > > > > > > However when I retrive the content, it's sometimes truncated. > > (It appears to > > > be for content greater than about 25k but that's a very rough > > > approximation). > > > > > > here's a snippet of my debugging code: > > > > > > org.postgresql.jdbc2.ResultSet.java > > > > > > if (fields[columnIndex - 1].getPGType().equals("bytea")) > > > { > > > String s = getString(columnIndex); > > > System.out.println("s = " + s); > > > byte[] result = PGbytea.toBytes(s); > > > System.out.println("result.length = " + result.length); > > > return result; > > > } > > > > > > the result.length returned (in one example) is 59402 bytes, > > when the length > > > of the bytea field is actually 190608 bytes. > > > > > > printing s to the console indeed reveals that it has been truncated. > > > > > > (As a test I inserted a list of a few thousand emails addresses > > in order, > > > starting from a-z - it gets truncated around f - although the > > DB has all the > > > way through to z ;)) > > > > > > I looked deeper into the source for about 30 minutes but got a > > little lost > > > in pg_stream in QueryExecutor and figured I'd leave the rest of the > > > investigation up to the experts! > > > > > > I couldn't find any related queries in the archives. > > > > > > Can anyone help? Or provide insight as to where I should > start looking? > > > > > > Cheers, > > > Mike > > > > > > Mike Cannon-Brookes :: mike@atlassian.com > > > > > > Atlassian :: http://www.atlassian.com > > > Supporting YOUR J2EE World > > > > > > > > > > > > ---------------------------(end of > broadcast)--------------------------- > > > TIP 4: Don't 'kill -9' the postmaster > > > > > > > > > > > > > > > ---------------------------(end of broadcast)--------------------------- > TIP 4: Don't 'kill -9' the postmaster
"Mike Cannon-Brookes" <mike@atlassian.com> writes:
> Any ideas on this? Do I need to install 7.2 beta to use bytea columns?
No, bytea's been around for a long time. I'm betting that you are
looking at a bug in the JDBC driver ... but I don't know enough about
JDBC to help debug it.
A possible starting point: do you see similar truncation on long
values of non-bytea types, eg text?
regards, tom lane
Mike, I hope to have time tonight to look into this bug. What would make that easier would be if you could provide a test case that demonstrates the problem. A simple create table foo then run this java main to see the problem would be great. thanks, --Barry Mike Cannon-Brookes wrote: > Any ideas on this? Do I need to install 7.2 beta to use bytea columns? (I'm > doubtful that would make a difference in this case). > > Can someone more knowledgeable about the driver internals point me to where > I can start to debug inside QueryExectutor / pg_stream? > > -mike > > > Mike Cannon-Brookes :: mike@atlassian.com > > Atlassian :: http://www.atlassian.com > Supporting YOUR J2EE World > > > > >>-----Original Message----- >>From: pgsql-jdbc-owner@postgresql.org >>[mailto:pgsql-jdbc-owner@postgresql.org]On Behalf Of Mike Cannon-Brookes >>Sent: Sunday, November 18, 2001 9:44 AM >>To: Barry Lind >>Cc: pgsql-jdbc@postgresql.org >>Subject: Re: [JDBC] Retrieving bytea column problem - they're are >>sometimes truncated >> >> >>Barry, >> >>Running postgres 7.1.3 and a freshly built driver from CVS. >> >>-mike >> >> >> >>>-----Original Message----- >>>From: Barry Lind [mailto:barry@xythos.com] >>>Sent: Sunday, November 18, 2001 7:46 AM >>>To: mike@atlassian.com >>>Cc: pgsql-jdbc@postgresql.org >>>Subject: Re: Retrieving bytea column problem - they're are sometimes >>>truncated >>> >>> >>>Mike, >>> >>>Which version of the database and drivers are you running? >>> >>>thanks, >>>--Barry >>> >>> >>>Mike Cannon-Brookes wrote: >>> >>> >>>>G'day all, >>>> >>>>I've been hacking at this all day and have now been through my >>>> >>>source and >>> >>>>then the driver source - grokking the entire postgres jdbc >>>> >>driver in the >> >>>>process ;) >>>> >>>>What happens is when I store binary content into a bytea field >>>> >>>it works fine >>> >>>>(using setBinaryStream() or setBytes()). I've tested this by >>>> >>>looking into >>> >>>>the DB at the actual content itself. >>>> >>>>However when I retrive the content, it's sometimes truncated. >>>> >>>(It appears to >>> >>>>be for content greater than about 25k but that's a very rough >>>>approximation). >>>> >>>>here's a snippet of my debugging code: >>>> >>>>org.postgresql.jdbc2.ResultSet.java >>>> >>>>if (fields[columnIndex - 1].getPGType().equals("bytea")) >>>>{ >>>> String s = getString(columnIndex); >>>> System.out.println("s = " + s); >>>> byte[] result = PGbytea.toBytes(s); >>>> System.out.println("result.length = " + result.length); >>>> return result; >>>>} >>>> >>>>the result.length returned (in one example) is 59402 bytes, >>>> >>>when the length >>> >>>>of the bytea field is actually 190608 bytes. >>>> >>>>printing s to the console indeed reveals that it has been truncated. >>>> >>>>(As a test I inserted a list of a few thousand emails addresses >>>> >>>in order, >>> >>>>starting from a-z - it gets truncated around f - although the >>>> >>>DB has all the >>> >>>>way through to z ;)) >>>> >>>>I looked deeper into the source for about 30 minutes but got a >>>> >>>little lost >>> >>>>in pg_stream in QueryExecutor and figured I'd leave the rest of the >>>>investigation up to the experts! >>>> >>>>I couldn't find any related queries in the archives. >>>> >>>>Can anyone help? Or provide insight as to where I should >>>> >>start looking? >> >>>>Cheers, >>>>Mike >>>> >>>>Mike Cannon-Brookes :: mike@atlassian.com >>>> >>>>Atlassian :: http://www.atlassian.com >>>> Supporting YOUR J2EE World >>>> >>>> >>>> >>>>---------------------------(end of >>>> >>broadcast)--------------------------- >> >>>>TIP 4: Don't 'kill -9' the postmaster >>>> >>>> >>>> >>> >>> >> >>---------------------------(end of broadcast)--------------------------- >>TIP 4: Don't 'kill -9' the postmaster >> >
Mike,
I tried but couldn't reproduce this problem. Below is the code I ran to
try to reproduce. I tried for various different sizes of content (with
my last run being 658890 bytes without any problem).
In order to research this more I will need a test case that reproduces
the problem you are seeing.
My environment:
Linux 2.4.7, PG 7.2b2, JDBC current CVS
(test program below requires the following table):
create table test (cola bytea);
import java.io.*;
import java.sql.*;
public class test2 {
public static void main(String[] p_args) {
try {
Class.forName("org.postgresql.Driver");
Connection l_conn;
l_conn =
DriverManager.getConnection("jdbc:postgresql://localhost:5432/files",
"blind", "");
l_conn.setAutoCommit(false);
PreparedStatement l_stmt = l_conn.prepareStatement("insert into
test values (?)");
Statement l_stmt2 = l_conn.createStatement();
StringBuffer l_strBuf = new StringBuffer();
for (int i = 0; i< 10000; i++) {
l_strBuf.append("-" + i + "-");
l_strBuf.append("123456789012345678901234567890123456789012345678901234567890");
}
byte[] l_value = l_strBuf.toString().getBytes();
System.out.println("insert length = " + l_value.length);
l_stmt.setBytes(1,l_value);
l_stmt.executeUpdate();
l_conn.commit();
ResultSet l_rset = l_stmt2.executeQuery("select cola from test");
while (l_rset.next()) {
byte[] l_result = l_rset.getBytes(1);
System.out.println("select length = " + l_result.length);
// System.out.println(new String(l_result));
}
} catch (Exception l_se) {
System.out.println(l_se.toString());
}
}
The results from running the above was:
$ java test2
insert length = 658890
select length = 658890
As I mentioned I tried with various different values of i in the program
but I always retrieved the same amount of data as I inserted.
thanks,
--Barry
Mike Cannon-Brookes wrote:
> Barry,
>
> Running postgres 7.1.3 and a freshly built driver from CVS.
>
> -mike
>
>
>
>>-----Original Message-----
>>From: Barry Lind [mailto:barry@xythos.com]
>>Sent: Sunday, November 18, 2001 7:46 AM
>>To: mike@atlassian.com
>>Cc: pgsql-jdbc@postgresql.org
>>Subject: Re: Retrieving bytea column problem - they're are sometimes
>>truncated
>>
>>
>>Mike,
>>
>>Which version of the database and drivers are you running?
>>
>>thanks,
>>--Barry
>>
>>
>>Mike Cannon-Brookes wrote:
>>
>>
>>>G'day all,
>>>
>>>I've been hacking at this all day and have now been through my
>>>
>>source and
>>
>>>then the driver source - grokking the entire postgres jdbc driver in the
>>>process ;)
>>>
>>>What happens is when I store binary content into a bytea field
>>>
>>it works fine
>>
>>>(using setBinaryStream() or setBytes()). I've tested this by
>>>
>>looking into
>>
>>>the DB at the actual content itself.
>>>
>>>However when I retrive the content, it's sometimes truncated.
>>>
>>(It appears to
>>
>>>be for content greater than about 25k but that's a very rough
>>>approximation).
>>>
>>>here's a snippet of my debugging code:
>>>
>>>org.postgresql.jdbc2.ResultSet.java
>>>
>>>if (fields[columnIndex - 1].getPGType().equals("bytea"))
>>>{
>>> String s = getString(columnIndex);
>>> System.out.println("s = " + s);
>>> byte[] result = PGbytea.toBytes(s);
>>> System.out.println("result.length = " + result.length);
>>> return result;
>>>}
>>>
>>>the result.length returned (in one example) is 59402 bytes,
>>>
>>when the length
>>
>>>of the bytea field is actually 190608 bytes.
>>>
>>>printing s to the console indeed reveals that it has been truncated.
>>>
>>>(As a test I inserted a list of a few thousand emails addresses
>>>
>>in order,
>>
>>>starting from a-z - it gets truncated around f - although the
>>>
>>DB has all the
>>
>>>way through to z ;))
>>>
>>>I looked deeper into the source for about 30 minutes but got a
>>>
>>little lost
>>
>>>in pg_stream in QueryExecutor and figured I'd leave the rest of the
>>>investigation up to the experts!
>>>
>>>I couldn't find any related queries in the archives.
>>>
>>>Can anyone help? Or provide insight as to where I should start looking?
>>>
>>>Cheers,
>>>Mike
>>>
>>>Mike Cannon-Brookes :: mike@atlassian.com
>>>
>>>Atlassian :: http://www.atlassian.com
>>> Supporting YOUR J2EE World
>>>
>>>
>>>
>>>---------------------------(end of broadcast)---------------------------
>>>TIP 4: Don't 'kill -9' the postmaster
>>>
>>>
>>>
>>
>>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster
>
>