Re: Issues with Array Interface - Mailing list pgsql-jdbc
From | Barry Lind |
---|---|
Subject | Re: Issues with Array Interface |
Date | |
Msg-id | 3CFBACBD.8080400@xythos.com Whole thread Raw |
In response to | Re: Issues with Array Interface (Noel Rappin <nrappin@sockeye.com>) |
List | pgsql-jdbc |
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
pgsql-jdbc by date: