Thread: Re: Issues with Array Interface

Re: Issues with Array Interface

From
Noel Rappin
Date:
Okay, let's try this...

The table def is roughly this...  It's archiving an entire days worth of
data into one row.  There are some other columns that are unimportant to
the current problem.

day    timestamp without time
time     timestamp with time zone []
value     real[]

I've tried a couple of things with the code, here's what I have now.  As
this works, the data result set generates correct values as it walks
throgh the set, but the times result set always gives the same value.

    public void addOneHistoryRow(ResultSet rs) throws SQLException {
        Array timeArray = rs.getArray("time");
        ResultSet times = timeArray.getResultSet();
        Array dataArray = rs.getArray("value");
        ResultSet data = dataArray.getResultSet();
        while (times.next()) {
            data.next();
            Number value = (Number) data.getObject(2);
            String timeString = times.getString(2);
            try {
                Timestamp time = new Timestamp(
                        inputFormat.parse(timeString).getTime());
                this.addOneDataPoint(time, value);
            } catch (ParseException e) {
                System.out.println(e);
            }
        }
        }

There's actually another issue here, which is that I had to parse the
Timestamp by hand -- I was getting an error on plain getObject() for the
time column, but that's also minor.

I've tried it a few different ways -- I tried having times be generated
with
Timestamp[] times = (Timestamp[]) timeArray.getArray();

Which had the same issue -- every enery in the array had the same value.

Thanks,

Noel


Dave Cramer wrote:

 >Noel,
 >
 >It would be helpful if you could provide sample code, and table
 >definitions (just enough to reproduce the problem) .
 >
 >Dave
 >On Thu, 2002-05-30 at 11:10, Noel Rappin wrote:
 >
 >
 >>I'm having some problems with the Array interface in 7.2, and I'm
 >>wondering if somebody can point me to a workaround.
 >>
 >>Issue 1:
 >>
 >>The array in the database is of type real[].  The code:
 >>
 >>Array dataArray = rs.getArray("value");
 >>Float[] data = (Float[]) dataArray.getArray();
 >>
 >>gives me a class cast exception.  This seems to be true no matter what I
 >>try to cast the array to (even Object[]),  When I work around by using
 >>dataArray.getResultSet(), it correctly casts the individual elements of
 >>the result to Float.  I have an analagous problem when the array is of
 >>type smallint.  Since I can work around this with the result set, it's
 >>less of a problem, but it is strange.
 >>
 >>Issue 2:
 >>
 >>The array in the database is of type timestamp with time zone [].
 >>
 >>Array timeArray = rs.getArray("time");
 >>Timestamp[] times = (Timestamp[]) timeArray.getArray();
 >>
 >>runs without a class cast exception, however every element in the array
 >>is set to the same value -- the value that would be at times[0].  This
 >>problem persists even if I use getResultSet() -- even when I next()
 >>through the array, the data value does not change.   I can't seem to
 >>access the later values in the array at all.
 >>
 >>Has anybody else seen this problem?  Any suggestions for workarounds?
 >> The data can be accessed correctly through psql, so I believe the
 >>problem must be in the driver.
 >>
 >>Thanks,
 >>
 >>Noel Rappin
 >>
 >>





Re: Issues with Array Interface

From
Noel Rappin
Date:
I think I may have found the timestamp bug -- this code is from
org.postgresql.jdbc2.Array.java:

This is lines 160- 170 in the getArray() function:

case Types.TIME:
    retVal = new java.sql.Time[ count ];
    for ( ; count > 0; count-- )
        ((java.sql.Time[])retVal)[i++] = ResultSet.toTime(
arrayContents[(int)index++] );
    break;
case Types.TIMESTAMP:
    retVal = new Timestamp[ count ];
    StringBuffer sbuf = null;
    for ( ; count > 0; count-- )
        ((java.sql.Timestamp[])retVal)[i++] = ResultSet.toTimestamp(
arrayContents[(int)index], rs );
    break;

Shouldn't the arrayContents[(int)index] in the TIMESTAMP clause also be
arrayContents[(int)index++]?

getResultSet() is dependent on getArray(), so that would show the same
behavior.

Will try to test this...

Noel

Noel Rappin wrote:

> Okay, let's try this...
>
> The table def is roughly this...  It's archiving an entire days worth of
> data into one row.  There are some other columns that are unimportant to
> the current problem.
>
> day    timestamp without time
> time     timestamp with time zone []
> value     real[]
>
> I've tried a couple of things with the code, here's what I have now.  As
> this works, the data result set generates correct values as it walks
> throgh the set, but the times result set always gives the same value.
>
>    public void addOneHistoryRow(ResultSet rs) throws SQLException {
>        Array timeArray = rs.getArray("time");
>        ResultSet times = timeArray.getResultSet();
>        Array dataArray = rs.getArray("value");
>        ResultSet data = dataArray.getResultSet();
>        while (times.next()) {
>            data.next();
>            Number value = (Number) data.getObject(2);
>            String timeString = times.getString(2);
>            try {
>                Timestamp time = new Timestamp(
>                        inputFormat.parse(timeString).getTime());
>                this.addOneDataPoint(time, value);
>            } catch (ParseException e) {
>                System.out.println(e);
>            }
>        }
>        }
>
> There's actually another issue here, which is that I had to parse the
> Timestamp by hand -- I was getting an error on plain getObject() for the
> time column, but that's also minor.
>
> I've tried it a few different ways -- I tried having times be generated
> with
> Timestamp[] times = (Timestamp[]) timeArray.getArray();
>
> Which had the same issue -- every enery in the array had the same value.
>
> Thanks,
>
> Noel
>
>
> Dave Cramer wrote:
>
> >Noel,
> >
> >It would be helpful if you could provide sample code, and table
> >definitions (just enough to reproduce the problem) .
> >
> >Dave
> >On Thu, 2002-05-30 at 11:10, Noel Rappin wrote:
> >
> >
> >>I'm having some problems with the Array interface in 7.2, and I'm
> >>wondering if somebody can point me to a workaround.
> >>
> >>Issue 1:
> >>
> >>The array in the database is of type real[].  The code:
> >>
> >>Array dataArray = rs.getArray("value");
> >>Float[] data = (Float[]) dataArray.getArray();
> >>
> >>gives me a class cast exception.  This seems to be true no matter
> what I
> >>try to cast the array to (even Object[]),  When I work around by using
> >>dataArray.getResultSet(), it correctly casts the individual elements of
> >>the result to Float.  I have an analagous problem when the array is of
> >>type smallint.  Since I can work around this with the result set, it's
> >>less of a problem, but it is strange.
> >>
> >>Issue 2:
> >>
> >>The array in the database is of type timestamp with time zone [].
> >>
> >>Array timeArray = rs.getArray("time");
> >>Timestamp[] times = (Timestamp[]) timeArray.getArray();
> >>
> >>runs without a class cast exception, however every element in the array
> >>is set to the same value -- the value that would be at times[0].  This
> >>problem persists even if I use getResultSet() -- even when I next()
> >>through the array, the data value does not change.   I can't seem to
> >>access the later values in the array at all.
> >>
> >>Has anybody else seen this problem?  Any suggestions for workarounds?
> >> The data can be accessed correctly through psql, so I believe the
> >>problem must be in the driver.
> >>
> >>Thanks,
> >>
> >>Noel Rappin
> >>
> >>
>
>
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster





Re: Issues with Array Interface

From
Noel Rappin
Date:
After compiling and testing, this does appear to fix the problem.  What
needs to be done to make the patch?

Noel

Noel Rappin wrote:

> I think I may have found the timestamp bug -- this code is from
> org.postgresql.jdbc2.Array.java:
>
> This is lines 160- 170 in the getArray() function:
>
> case Types.TIME:
>    retVal = new java.sql.Time[ count ];
>    for ( ; count > 0; count-- )
>        ((java.sql.Time[])retVal)[i++] = ResultSet.toTime(
> arrayContents[(int)index++] );
>    break;
> case Types.TIMESTAMP:
>    retVal = new Timestamp[ count ];
>    StringBuffer sbuf = null;
>    for ( ; count > 0; count-- )
>        ((java.sql.Timestamp[])retVal)[i++] = ResultSet.toTimestamp(
> arrayContents[(int)index], rs );
>    break;
>
> Shouldn't the arrayContents[(int)index] in the TIMESTAMP clause also
> be arrayContents[(int)index++]?
>
> getResultSet() is dependent on getArray(), so that would show the same
> behavior.
>
> Will try to test this...
>
> Noel
>
> Noel Rappin wrote:
>
>> Okay, let's try this...
>>
>> The table def is roughly this...  It's archiving an entire days worth of
>> data into one row.  There are some other columns that are unimportant to
>> the current problem.
>>
>> day    timestamp without time
>> time     timestamp with time zone []
>> value     real[]
>>
>> I've tried a couple of things with the code, here's what I have now.  As
>> this works, the data result set generates correct values as it walks
>> throgh the set, but the times result set always gives the same value.
>>
>>    public void addOneHistoryRow(ResultSet rs) throws SQLException {
>>        Array timeArray = rs.getArray("time");
>>        ResultSet times = timeArray.getResultSet();
>>        Array dataArray = rs.getArray("value");
>>        ResultSet data = dataArray.getResultSet();
>>        while (times.next()) {
>>            data.next();
>>            Number value = (Number) data.getObject(2);
>>            String timeString = times.getString(2);
>>            try {
>>                Timestamp time = new Timestamp(
>>                        inputFormat.parse(timeString).getTime());
>>                this.addOneDataPoint(time, value);
>>            } catch (ParseException e) {
>>                System.out.println(e);
>>            }
>>        }
>>        }
>>
>> There's actually another issue here, which is that I had to parse the
>> Timestamp by hand -- I was getting an error on plain getObject() for the
>> time column, but that's also minor.
>>
>> I've tried it a few different ways -- I tried having times be generated
>> with
>> Timestamp[] times = (Timestamp[]) timeArray.getArray();
>>
>> Which had the same issue -- every enery in the array had the same value.
>>
>> Thanks,
>>
>> Noel
>>
>>
>> Dave Cramer wrote:
>>
>> >Noel,
>> >
>> >It would be helpful if you could provide sample code, and table
>> >definitions (just enough to reproduce the problem) .
>> >
>> >Dave
>> >On Thu, 2002-05-30 at 11:10, Noel Rappin wrote:
>> >
>> >
>> >>I'm having some problems with the Array interface in 7.2, and I'm
>> >>wondering if somebody can point me to a workaround.
>> >>
>> >>Issue 1:
>> >>
>> >>The array in the database is of type real[].  The code:
>> >>
>> >>Array dataArray = rs.getArray("value");
>> >>Float[] data = (Float[]) dataArray.getArray();
>> >>
>> >>gives me a class cast exception.  This seems to be true no matter
>> what I
>> >>try to cast the array to (even Object[]),  When I work around by using
>> >>dataArray.getResultSet(), it correctly casts the individual
>> elements of
>> >>the result to Float.  I have an analagous problem when the array is of
>> >>type smallint.  Since I can work around this with the result set, it's
>> >>less of a problem, but it is strange.
>> >>
>> >>Issue 2:
>> >>
>> >>The array in the database is of type timestamp with time zone [].
>> >>
>> >>Array timeArray = rs.getArray("time");
>> >>Timestamp[] times = (Timestamp[]) timeArray.getArray();
>> >>
>> >>runs without a class cast exception, however every element in the
>> array
>> >>is set to the same value -- the value that would be at times[0].  This
>> >>problem persists even if I use getResultSet() -- even when I next()
>> >>through the array, the data value does not change.   I can't seem to
>> >>access the later values in the array at all.
>> >>
>> >>Has anybody else seen this problem?  Any suggestions for workarounds?
>> >> The data can be accessed correctly through psql, so I believe the
>> >>problem must be in the driver.
>> >>
>> >>Thanks,
>> >>
>> >>Noel Rappin
>> >>
>> >>
>>
>>
>>
>>
>>
>> ---------------------------(end of broadcast)---------------------------
>> TIP 4: Don't 'kill -9' the postmaster
>
>
>
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 6: Have you searched our list archives?
>
> http://archives.postgresql.org





Re: Issues with Array Interface

From
Dave Cramer
Date:
Noel,

This is great, can you do a send a context diff into the list. You can
produce this using cvs, or diff.

for diff it is diff -c file1 file2 >patchfile
for cvs it is cvs diff -c file >patchfile

then send the patchfile

Dave
On Fri, 2002-05-31 at 11:07, Noel Rappin wrote:
> After compiling and testing, this does appear to fix the problem.  What
> needs to be done to make the patch?
>
> Noel
>
> Noel Rappin wrote:
>
> > I think I may have found the timestamp bug -- this code is from
> > org.postgresql.jdbc2.Array.java:
> >
> > This is lines 160- 170 in the getArray() function:
> >
> > case Types.TIME:
> >    retVal = new java.sql.Time[ count ];
> >    for ( ; count > 0; count-- )
> >        ((java.sql.Time[])retVal)[i++] = ResultSet.toTime(
> > arrayContents[(int)index++] );
> >    break;
> > case Types.TIMESTAMP:
> >    retVal = new Timestamp[ count ];
> >    StringBuffer sbuf = null;
> >    for ( ; count > 0; count-- )
> >        ((java.sql.Timestamp[])retVal)[i++] = ResultSet.toTimestamp(
> > arrayContents[(int)index], rs );
> >    break;
> >
> > Shouldn't the arrayContents[(int)index] in the TIMESTAMP clause also
> > be arrayContents[(int)index++]?
> >
> > getResultSet() is dependent on getArray(), so that would show the same
> > behavior.
> >
> > Will try to test this...
> >
> > Noel
> >
> > Noel Rappin wrote:
> >
> >> Okay, let's try this...
> >>
> >> The table def is roughly this...  It's archiving an entire days worth of
> >> data into one row.  There are some other columns that are unimportant to
> >> the current problem.
> >>
> >> day    timestamp without time
> >> time     timestamp with time zone []
> >> value     real[]
> >>
> >> I've tried a couple of things with the code, here's what I have now.  As
> >> this works, the data result set generates correct values as it walks
> >> throgh the set, but the times result set always gives the same value.
> >>
> >>    public void addOneHistoryRow(ResultSet rs) throws SQLException {
> >>        Array timeArray = rs.getArray("time");
> >>        ResultSet times = timeArray.getResultSet();
> >>        Array dataArray = rs.getArray("value");
> >>        ResultSet data = dataArray.getResultSet();
> >>        while (times.next()) {
> >>            data.next();
> >>            Number value = (Number) data.getObject(2);
> >>            String timeString = times.getString(2);
> >>            try {
> >>                Timestamp time = new Timestamp(
> >>                        inputFormat.parse(timeString).getTime());
> >>                this.addOneDataPoint(time, value);
> >>            } catch (ParseException e) {
> >>                System.out.println(e);
> >>            }
> >>        }
> >>        }
> >>
> >> There's actually another issue here, which is that I had to parse the
> >> Timestamp by hand -- I was getting an error on plain getObject() for the
> >> time column, but that's also minor.
> >>
> >> I've tried it a few different ways -- I tried having times be generated
> >> with
> >> Timestamp[] times = (Timestamp[]) timeArray.getArray();
> >>
> >> Which had the same issue -- every enery in the array had the same value.
> >>
> >> Thanks,
> >>
> >> Noel
> >>
> >>
> >> Dave Cramer wrote:
> >>
> >> >Noel,
> >> >
> >> >It would be helpful if you could provide sample code, and table
> >> >definitions (just enough to reproduce the problem) .
> >> >
> >> >Dave
> >> >On Thu, 2002-05-30 at 11:10, Noel Rappin wrote:
> >> >
> >> >
> >> >>I'm having some problems with the Array interface in 7.2, and I'm
> >> >>wondering if somebody can point me to a workaround.
> >> >>
> >> >>Issue 1:
> >> >>
> >> >>The array in the database is of type real[].  The code:
> >> >>
> >> >>Array dataArray = rs.getArray("value");
> >> >>Float[] data = (Float[]) dataArray.getArray();
> >> >>
> >> >>gives me a class cast exception.  This seems to be true no matter
> >> what I
> >> >>try to cast the array to (even Object[]),  When I work around by using
> >> >>dataArray.getResultSet(), it correctly casts the individual
> >> elements of
> >> >>the result to Float.  I have an analagous problem when the array is of
> >> >>type smallint.  Since I can work around this with the result set, it's
> >> >>less of a problem, but it is strange.
> >> >>
> >> >>Issue 2:
> >> >>
> >> >>The array in the database is of type timestamp with time zone [].
> >> >>
> >> >>Array timeArray = rs.getArray("time");
> >> >>Timestamp[] times = (Timestamp[]) timeArray.getArray();
> >> >>
> >> >>runs without a class cast exception, however every element in the
> >> array
> >> >>is set to the same value -- the value that would be at times[0].  This
> >> >>problem persists even if I use getResultSet() -- even when I next()
> >> >>through the array, the data value does not change.   I can't seem to
> >> >>access the later values in the array at all.
> >> >>
> >> >>Has anybody else seen this problem?  Any suggestions for workarounds?
> >> >> The data can be accessed correctly through psql, so I believe the
> >> >>problem must be in the driver.
> >> >>
> >> >>Thanks,
> >> >>
> >> >>Noel Rappin
> >> >>
> >> >>
> >>
> >>
> >>
> >>
> >>
> >> ---------------------------(end of broadcast)---------------------------
> >> TIP 4: Don't 'kill -9' the postmaster
> >
> >
> >
> >
> >
> >
> > ---------------------------(end of broadcast)---------------------------
> > TIP 6: Have you searched our list archives?
> >
> > http://archives.postgresql.org
>
>
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 5: Have you checked our extensive FAQ?
>
> http://www.postgresql.org/users-lounge/docs/faq.html
>
>




Re: Issues with Array Interface

From
Barry Lind
Date:
Noel,

Yes that certainly looks like the problem.  If you can confirm that this
fixes the issue I will commit this fix to CVS.

thanks,
--Barry


Noel Rappin wrote:
> I think I may have found the timestamp bug -- this code is from
> org.postgresql.jdbc2.Array.java:
>
> This is lines 160- 170 in the getArray() function:
>
> case Types.TIME:
>    retVal = new java.sql.Time[ count ];
>    for ( ; count > 0; count-- )
>        ((java.sql.Time[])retVal)[i++] = ResultSet.toTime(
> arrayContents[(int)index++] );
>    break;
> case Types.TIMESTAMP:
>    retVal = new Timestamp[ count ];
>    StringBuffer sbuf = null;
>    for ( ; count > 0; count-- )
>        ((java.sql.Timestamp[])retVal)[i++] = ResultSet.toTimestamp(
> arrayContents[(int)index], rs );
>    break;
>
> Shouldn't the arrayContents[(int)index] in the TIMESTAMP clause also be
> arrayContents[(int)index++]?
>
> getResultSet() is dependent on getArray(), so that would show the same
> behavior.
>
> Will try to test this...
>
> Noel
>
> Noel Rappin wrote:
>
>> Okay, let's try this...
>>
>> The table def is roughly this...  It's archiving an entire days worth of
>> data into one row.  There are some other columns that are unimportant to
>> the current problem.
>>
>> day    timestamp without time
>> time     timestamp with time zone []
>> value     real[]
>>
>> I've tried a couple of things with the code, here's what I have now.  As
>> this works, the data result set generates correct values as it walks
>> throgh the set, but the times result set always gives the same value.
>>
>>    public void addOneHistoryRow(ResultSet rs) throws SQLException {
>>        Array timeArray = rs.getArray("time");
>>        ResultSet times = timeArray.getResultSet();
>>        Array dataArray = rs.getArray("value");
>>        ResultSet data = dataArray.getResultSet();
>>        while (times.next()) {
>>            data.next();
>>            Number value = (Number) data.getObject(2);
>>            String timeString = times.getString(2);
>>            try {
>>                Timestamp time = new Timestamp(
>>                        inputFormat.parse(timeString).getTime());
>>                this.addOneDataPoint(time, value);
>>            } catch (ParseException e) {
>>                System.out.println(e);
>>            }
>>        }
>>        }
>>
>> There's actually another issue here, which is that I had to parse the
>> Timestamp by hand -- I was getting an error on plain getObject() for the
>> time column, but that's also minor.
>>
>> I've tried it a few different ways -- I tried having times be generated
>> with
>> Timestamp[] times = (Timestamp[]) timeArray.getArray();
>>
>> Which had the same issue -- every enery in the array had the same value.
>>
>> Thanks,
>>
>> Noel
>>
>>
>> Dave Cramer wrote:
>>
>> >Noel,
>> >
>> >It would be helpful if you could provide sample code, and table
>> >definitions (just enough to reproduce the problem) .
>> >
>> >Dave
>> >On Thu, 2002-05-30 at 11:10, Noel Rappin wrote:
>> >
>> >
>> >>I'm having some problems with the Array interface in 7.2, and I'm
>> >>wondering if somebody can point me to a workaround.
>> >>
>> >>Issue 1:
>> >>
>> >>The array in the database is of type real[].  The code:
>> >>
>> >>Array dataArray = rs.getArray("value");
>> >>Float[] data = (Float[]) dataArray.getArray();
>> >>
>> >>gives me a class cast exception.  This seems to be true no matter
>> what I
>> >>try to cast the array to (even Object[]),  When I work around by using
>> >>dataArray.getResultSet(), it correctly casts the individual elements of
>> >>the result to Float.  I have an analagous problem when the array is of
>> >>type smallint.  Since I can work around this with the result set, it's
>> >>less of a problem, but it is strange.
>> >>
>> >>Issue 2:
>> >>
>> >>The array in the database is of type timestamp with time zone [].
>> >>
>> >>Array timeArray = rs.getArray("time");
>> >>Timestamp[] times = (Timestamp[]) timeArray.getArray();
>> >>
>> >>runs without a class cast exception, however every element in the array
>> >>is set to the same value -- the value that would be at times[0].  This
>> >>problem persists even if I use getResultSet() -- even when I next()
>> >>through the array, the data value does not change.   I can't seem to
>> >>access the later values in the array at all.
>> >>
>> >>Has anybody else seen this problem?  Any suggestions for workarounds?
>> >> The data can be accessed correctly through psql, so I believe the
>> >>problem must be in the driver.
>> >>
>> >>Thanks,
>> >>
>> >>Noel Rappin
>> >>
>> >>
>>
>>
>>
>>
>>
>> ---------------------------(end of broadcast)---------------------------
>> TIP 4: Don't 'kill -9' the postmaster
>
>
>
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 6: Have you searched our list archives?
>
> http://archives.postgresql.org
>



Re: Issues with Array Interface

From
Noel Rappin
Date:
I think this is it.  Let me know if there are any problems.

Noel

Dave Cramer wrote:

>Noel,
>
>This is great, can you do a send a context diff into the list. You can
>produce this using cvs, or diff.
>
>for diff it is diff -c file1 file2 >patchfile
>for cvs it is cvs diff -c file >patchfile
>
>then send the patchfile
>
>Dave
>On Fri, 2002-05-31 at 11:07, Noel Rappin wrote:
>
>
>>After compiling and testing, this does appear to fix the problem.  What
>>needs to be done to make the patch?
>>
>>Noel
>>
>>Noel Rappin wrote:
>>
>>
>>
>>>I think I may have found the timestamp bug -- this code is from
>>>org.postgresql.jdbc2.Array.java:
>>>
>>>This is lines 160- 170 in the getArray() function:
>>>
>>>case Types.TIME:
>>>   retVal = new java.sql.Time[ count ];
>>>   for ( ; count > 0; count-- )
>>>       ((java.sql.Time[])retVal)[i++] = ResultSet.toTime(
>>>arrayContents[(int)index++] );
>>>   break;
>>>case Types.TIMESTAMP:
>>>   retVal = new Timestamp[ count ];
>>>   StringBuffer sbuf = null;
>>>   for ( ; count > 0; count-- )
>>>       ((java.sql.Timestamp[])retVal)[i++] = ResultSet.toTimestamp(
>>>arrayContents[(int)index], rs );
>>>   break;
>>>
>>>Shouldn't the arrayContents[(int)index] in the TIMESTAMP clause also
>>>be arrayContents[(int)index++]?
>>>
>>>getResultSet() is dependent on getArray(), so that would show the same
>>>behavior.
>>>
>>>Will try to test this...
>>>
>>>Noel
>>>
>>>Noel Rappin wrote:
>>>
>>>
>>>
>>>>Okay, let's try this...
>>>>
>>>>The table def is roughly this...  It's archiving an entire days worth of
>>>>data into one row.  There are some other columns that are unimportant to
>>>>the current problem.
>>>>
>>>>day    timestamp without time
>>>>time     timestamp with time zone []
>>>>value     real[]
>>>>
>>>>I've tried a couple of things with the code, here's what I have now.  As
>>>>this works, the data result set generates correct values as it walks
>>>>throgh the set, but the times result set always gives the same value.
>>>>
>>>>   public void addOneHistoryRow(ResultSet rs) throws SQLException {
>>>>       Array timeArray = rs.getArray("time");
>>>>       ResultSet times = timeArray.getResultSet();
>>>>       Array dataArray = rs.getArray("value");
>>>>       ResultSet data = dataArray.getResultSet();
>>>>       while (times.next()) {
>>>>           data.next();
>>>>           Number value = (Number) data.getObject(2);
>>>>           String timeString = times.getString(2);
>>>>           try {
>>>>               Timestamp time = new Timestamp(
>>>>                       inputFormat.parse(timeString).getTime());
>>>>               this.addOneDataPoint(time, value);
>>>>           } catch (ParseException e) {
>>>>               System.out.println(e);
>>>>           }
>>>>       }
>>>>       }
>>>>
>>>>There's actually another issue here, which is that I had to parse the
>>>>Timestamp by hand -- I was getting an error on plain getObject() for the
>>>>time column, but that's also minor.
>>>>
>>>>I've tried it a few different ways -- I tried having times be generated
>>>>with
>>>>Timestamp[] times = (Timestamp[]) timeArray.getArray();
>>>>
>>>>Which had the same issue -- every enery in the array had the same value.
>>>>
>>>>Thanks,
>>>>
>>>>Noel
>>>>
>>>>
>>>>Dave Cramer wrote:
>>>>
>>>>
>>>>
>>>>>Noel,
>>>>>
>>>>>It would be helpful if you could provide sample code, and table
>>>>>definitions (just enough to reproduce the problem) .
>>>>>
>>>>>Dave
>>>>>On Thu, 2002-05-30 at 11:10, Noel Rappin wrote:
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>>I'm having some problems with the Array interface in 7.2, and I'm
>>>>>>wondering if somebody can point me to a workaround.
>>>>>>
>>>>>>Issue 1:
>>>>>>
>>>>>>The array in the database is of type real[].  The code:
>>>>>>
>>>>>>Array dataArray = rs.getArray("value");
>>>>>>Float[] data = (Float[]) dataArray.getArray();
>>>>>>
>>>>>>gives me a class cast exception.  This seems to be true no matter
>>>>>>
>>>>>>
>>>>what I
>>>>
>>>>
>>>>>>try to cast the array to (even Object[]),  When I work around by using
>>>>>>dataArray.getResultSet(), it correctly casts the individual
>>>>>>
>>>>>>
>>>>elements of
>>>>
>>>>
>>>>>>the result to Float.  I have an analagous problem when the array is of
>>>>>>type smallint.  Since I can work around this with the result set, it's
>>>>>>less of a problem, but it is strange.
>>>>>>
>>>>>>Issue 2:
>>>>>>
>>>>>>The array in the database is of type timestamp with time zone [].
>>>>>>
>>>>>>Array timeArray = rs.getArray("time");
>>>>>>Timestamp[] times = (Timestamp[]) timeArray.getArray();
>>>>>>
>>>>>>runs without a class cast exception, however every element in the
>>>>>>
>>>>>>
>>>>array
>>>>
>>>>
>>>>>>is set to the same value -- the value that would be at times[0].  This
>>>>>>problem persists even if I use getResultSet() -- even when I next()
>>>>>>through the array, the data value does not change.   I can't seem to
>>>>>>access the later values in the array at all.
>>>>>>
>>>>>>Has anybody else seen this problem?  Any suggestions for workarounds?
>>>>>>The data can be accessed correctly through psql, so I believe the
>>>>>>problem must be in the driver.
>>>>>>
>>>>>>Thanks,
>>>>>>
>>>>>>Noel Rappin
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>
>>>>
>>>>
>>>>---------------------------(end of broadcast)---------------------------
>>>>TIP 4: Don't 'kill -9' the postmaster
>>>>
>>>>
>>>
>>>
>>>
>>>
>>>---------------------------(end of broadcast)---------------------------
>>>TIP 6: Have you searched our list archives?
>>>
>>>http://archives.postgresql.org
>>>
>>>
>>
>>
>>
>>---------------------------(end of broadcast)---------------------------
>>TIP 5: Have you checked our extensive FAQ?
>>
>>http://www.postgresql.org/users-lounge/docs/faq.html
>>
>>
>>
>>
>
>
>
>
>---------------------------(end of broadcast)---------------------------
>TIP 4: Don't 'kill -9' the postmaster
>
>


Attachment

Re: Issues with Array Interface

From
Barry Lind
Date:
I have commited this fix.  Thanks for the bug report and the fix.

--Barry

Noel Rappin wrote:
> I think this is it.  Let me know if there are any problems.
>
> Noel
>
> Dave Cramer wrote:
>
>> Noel,
>>
>> This is great, can you do a send a context diff into the list. You can
>> produce this using cvs, or diff.
>>
>> for diff it is diff -c file1 file2 >patchfile
>> for cvs it is cvs diff -c file >patchfile
>>
>> then send the patchfile
>>
>> Dave
>> On Fri, 2002-05-31 at 11:07, Noel Rappin wrote:
>>
>>
>>> After compiling and testing, this does appear to fix the problem.
>>> What needs to be done to make the patch?
>>>
>>> Noel
>>>
>>> Noel Rappin wrote:
>>>
>>>
>>>
>>>> I think I may have found the timestamp bug -- this code is from
>>>> org.postgresql.jdbc2.Array.java:
>>>>
>>>> This is lines 160- 170 in the getArray() function:
>>>>
>>>> case Types.TIME:
>>>>   retVal = new java.sql.Time[ count ];
>>>>   for ( ; count > 0; count-- )
>>>>       ((java.sql.Time[])retVal)[i++] = ResultSet.toTime(
>>>> arrayContents[(int)index++] );
>>>>   break;
>>>> case Types.TIMESTAMP:
>>>>   retVal = new Timestamp[ count ];
>>>>   StringBuffer sbuf = null;
>>>>   for ( ; count > 0; count-- )
>>>>       ((java.sql.Timestamp[])retVal)[i++] = ResultSet.toTimestamp(
>>>> arrayContents[(int)index], rs );
>>>>   break;
>>>>
>>>> Shouldn't the arrayContents[(int)index] in the TIMESTAMP clause also
>>>> be arrayContents[(int)index++]?
>>>>
>>>> getResultSet() is dependent on getArray(), so that would show the
>>>> same behavior.
>>>>
>>>> Will try to test this...
>>>>
>>>> Noel
>>>>
>>>> Noel Rappin wrote:
>>>>
>>>>
>>>>
>>>>> Okay, let's try this...
>>>>>
>>>>> The table def is roughly this...  It's archiving an entire days
>>>>> worth of
>>>>> data into one row.  There are some other columns that are
>>>>> unimportant to
>>>>> the current problem.
>>>>>
>>>>> day    timestamp without time
>>>>> time     timestamp with time zone []
>>>>> value     real[]
>>>>>
>>>>> I've tried a couple of things with the code, here's what I have
>>>>> now.  As
>>>>> this works, the data result set generates correct values as it walks
>>>>> throgh the set, but the times result set always gives the same value.
>>>>>
>>>>>   public void addOneHistoryRow(ResultSet rs) throws SQLException {
>>>>>       Array timeArray = rs.getArray("time");
>>>>>       ResultSet times = timeArray.getResultSet();
>>>>>       Array dataArray = rs.getArray("value");
>>>>>       ResultSet data = dataArray.getResultSet();
>>>>>       while (times.next()) {
>>>>>           data.next();
>>>>>           Number value = (Number) data.getObject(2);
>>>>>           String timeString = times.getString(2);
>>>>>           try {
>>>>>               Timestamp time = new Timestamp(
>>>>>                       inputFormat.parse(timeString).getTime());
>>>>>               this.addOneDataPoint(time, value);
>>>>>           } catch (ParseException e) {
>>>>>               System.out.println(e);
>>>>>           }
>>>>>       }
>>>>>       }
>>>>>
>>>>> There's actually another issue here, which is that I had to parse the
>>>>> Timestamp by hand -- I was getting an error on plain getObject()
>>>>> for the
>>>>> time column, but that's also minor.
>>>>>
>>>>> I've tried it a few different ways -- I tried having times be
>>>>> generated
>>>>> with
>>>>> Timestamp[] times = (Timestamp[]) timeArray.getArray();
>>>>>
>>>>> Which had the same issue -- every enery in the array had the same
>>>>> value.
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Noel
>>>>>
>>>>>
>>>>> Dave Cramer wrote:
>>>>>
>>>>>
>>>>>
>>>>>> Noel,
>>>>>>
>>>>>> It would be helpful if you could provide sample code, and table
>>>>>> definitions (just enough to reproduce the problem) .
>>>>>>
>>>>>> Dave
>>>>>> On Thu, 2002-05-30 at 11:10, Noel Rappin wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>> I'm having some problems with the Array interface in 7.2, and I'm
>>>>>>> wondering if somebody can point me to a workaround.
>>>>>>>
>>>>>>> Issue 1:
>>>>>>>
>>>>>>> The array in the database is of type real[].  The code:
>>>>>>>
>>>>>>> Array dataArray = rs.getArray("value");
>>>>>>> Float[] data = (Float[]) dataArray.getArray();
>>>>>>>
>>>>>>> gives me a class cast exception.  This seems to be true no matter
>>>>>>>
>>>>>>
>>>>> what I
>>>>>
>>>>>
>>>>>>> try to cast the array to (even Object[]),  When I work around by
>>>>>>> using
>>>>>>> dataArray.getResultSet(), it correctly casts the individual
>>>>>>>
>>>>>>
>>>>> elements of
>>>>>
>>>>>
>>>>>>> the result to Float.  I have an analagous problem when the array
>>>>>>> is of
>>>>>>> type smallint.  Since I can work around this with the result set,
>>>>>>> it's
>>>>>>> less of a problem, but it is strange.
>>>>>>>
>>>>>>> Issue 2:
>>>>>>>
>>>>>>> The array in the database is of type timestamp with time zone [].
>>>>>>>
>>>>>>> Array timeArray = rs.getArray("time");
>>>>>>> Timestamp[] times = (Timestamp[]) timeArray.getArray();
>>>>>>>
>>>>>>> runs without a class cast exception, however every element in the
>>>>>>>
>>>>>>
>>>>> array
>>>>>
>>>>>
>>>>>>> is set to the same value -- the value that would be at times[0].
>>>>>>> This
>>>>>>> problem persists even if I use getResultSet() -- even when I next()
>>>>>>> through the array, the data value does not change.   I can't seem to
>>>>>>> access the later values in the array at all.
>>>>>>>
>>>>>>> Has anybody else seen this problem?  Any suggestions for
>>>>>>> workarounds?
>>>>>>> The data can be accessed correctly through psql, so I believe the
>>>>>>> problem must be in the driver.
>>>>>>>
>>>>>>> Thanks,
>>>>>>>
>>>>>>> Noel Rappin
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> ---------------------------(end of
>>>>> broadcast)---------------------------
>>>>> TIP 4: Don't 'kill -9' the postmaster
>>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> ---------------------------(end of
>>>> broadcast)---------------------------
>>>> TIP 6: Have you searched our list archives?
>>>>
>>>> http://archives.postgresql.org
>>>>
>>>
>>>
>>>
>>>
>>> ---------------------------(end of broadcast)---------------------------
>>> TIP 5: Have you checked our extensive FAQ?
>>>
>>> http://www.postgresql.org/users-lounge/docs/faq.html
>>>
>>>
>>>
>>
>>
>>
>>
>>
>> ---------------------------(end of broadcast)---------------------------
>> TIP 4: Don't 'kill -9' the postmaster
>>
>>
>
>
> ------------------------------------------------------------------------
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo@postgresql.org so that your
> message can get through to the mailing list cleanly