Thread: Help: ResultSet..insertRow() not coping with explicit oid

Help: ResultSet..insertRow() not coping with explicit oid

From
Jim Wright
Date:
Hi,

I have some code which I think effectively does this:

statement = connection.createStatement(
                  ResultSet.TYPE_SCROLL_SENSITIVE,
                  ResultSet.CONCUR_UPDATABLE));
resultSet = statement.executeQuery(
         "SELECT oid, * FROM " + table.ID);
resultSet.moveToInsertRow();
resultSet.updateXXX(...);
...
resultSet.insertRow();

At which point I get the SQLException:

ERROR:  Relation "character" has no column "oid"

(Sorry about the confusing table name)

I have tried both with and without updateLong()
for the oid.

This looks like a bug. If I believe the manual
then result sets are readonly but I assume the
code is ahead of the docs.

I have postgresql-7.3.1-6.src.rpm under Red Hat
8.0 and pg73jdbc3.jar.

So what is the story. Am I doing it wrong? Is this
fixed in a later release?

Help much appreciated,

Jim Wright

--
Recently completed - Child Brain Injury Trust
Admin System
http://cbitdemo.paneris.org/

Urgently seeking paid work
Java, Linux, XML and much more.
http://be.webz.cz/


Re: Help: ResultSet..insertRow() not coping with explicit

From
Dave Cramer
Date:
Jim,

can you send me a test case which demonstrates this?

Dave
On Mon, 2003-09-22 at 04:06, Jim Wright wrote:
> Hi,
>
> I have some code which I think effectively does this:
>
> statement = connection.createStatement(
>                   ResultSet.TYPE_SCROLL_SENSITIVE,
>                   ResultSet.CONCUR_UPDATABLE));
> resultSet = statement.executeQuery(
>          "SELECT oid, * FROM " + table.ID);
> resultSet.moveToInsertRow();
> resultSet.updateXXX(...);
> ...
> resultSet.insertRow();
>
> At which point I get the SQLException:
>
> ERROR:  Relation "character" has no column "oid"
>
> (Sorry about the confusing table name)
>
> I have tried both with and without updateLong()
> for the oid.
>
> This looks like a bug. If I believe the manual
> then result sets are readonly but I assume the
> code is ahead of the docs.
>
> I have postgresql-7.3.1-6.src.rpm under Red Hat
> 8.0 and pg73jdbc3.jar.
>
> So what is the story. Am I doing it wrong? Is this
> fixed in a later release?
>
> Help much appreciated,
>
> Jim Wright
--
Dave Cramer <Dave@micro-automation.net>


Re: Help: ResultSet..insertRow() not coping with explicit

From
Jim Wright
Date:
Hi Dave,

Dave Cramer wrote:

>Jim,
>
>can you send me a test case which demonstrates this?
>
>
I have edited the JDBC test suite in my cvs working directory.
I have not done a cvs update recently so note the version number.
Additional comments follow:

---
src/interfaces/jdbc/org/postgresql/test/jdbc2/UpdateableResultTest.java.~1.7.~
2002-09-11 07:38:45.000000000 +0200
+++
src/interfaces/jdbc/org/postgresql/test/jdbc2/UpdateableResultTest.java
2003-09-24 07:19:39.000000000 +0200
@@ -66,6 +66,17 @@

             rs.close();

+            rs = st.executeQuery( "select oid, * from updateable");
+
+            assertNotNull( rs );
+            rs.moveToInsertRow();
+            rs.updateInt( 1, 1 );
+            rs.updateString( 2, "jim" );
+            rs.updateString( 3, "4gotenit" );
+            rs.insertRow();
+
+            rs.close();
+
             rs = st.executeQuery("select id1, id, name, name1 from
updateable, second" );
             try
             {

My postgres installation was not built from this source:

>On Mon, 2003-09-22 at 04:06, Jim Wright wrote:
>
>
>>I have postgresql-7.3.1-6.src.rpm under Red Hat
>>8.0 and pg73jdbc3.jar.
>>
>>
so it might conceivably work for you. Ant output:

runtest:
    [junit] Testsuite: org.postgresql.test.jdbc2.Jdbc2TestSuite
    [junit] Tests run: 76, Failures: 1, Errors: 5, Time elapsed: 11.217 sec

    [junit] Testcase:
testUpdateable(org.postgresql.test.jdbc2.UpdateableResultTest):    FAILED
    [junit] ERROR:  Relation "updateable" has no column "oid"
    [junit] junit.framework.AssertionFailedError: ERROR:  Relation
"updateable" has no column "oid"
    [junit]     at
org.postgresql.test.jdbc2.UpdateableResultTest.testUpdateable(UpdateableResultTest.java:143)
    [junit]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native
Method)
    [junit]     at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    [junit]     at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)


    [junit] Testcase:
testGetDouble(org.postgresql.test.jdbc2.CallableStmtTest):    Caused an
ERROR
    [junit] ERROR:  language "plpgsql" does not exist
    [junit] java.sql.SQLException: ERROR:  language "plpgsql" does not exist
    [junit]     at
org.postgresql.core.QueryExecutor.executeV2(QueryExecutor.java:286)
    [junit]     at
org.postgresql.core.QueryExecutor.execute(QueryExecutor.java:104)
    [junit]     at
org.postgresql.core.QueryExecutor.execute(QueryExecutor.java:42)
    [junit]     at
org.postgresql.jdbc1.AbstractJdbc1Statement.execute(AbstractJdbc1Statement.java:437)
    [junit]     at
org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:49)
    [junit]     at
org.postgresql.jdbc1.AbstractJdbc1Statement.execute(AbstractJdbc1Statement.java:275)
    [junit]     at
org.postgresql.test.jdbc2.CallableStmtTest.setUp(CallableStmtTest.java:29)

[snip 4 irrelevant errors similar to the last]

    [junit] TEST org.postgresql.test.jdbc2.Jdbc2TestSuite FAILED
    [junit] Testsuite: org.postgresql.test.jdbc2.optional.OptionalTestSuite
    [junit] Tests run: 34, Failures: 0, Errors: 0, Time elapsed: 8.065 sec

    [junit] Testsuite: org.postgresql.test.jdbc3.Jdbc3TestSuite
    [junit] Tests run: 38, Failures: 0, Errors: 0, Time elapsed: 8.997 sec

Hope that's all OK and if this is a valid test you have my permission
to include it in the suite under the same license etc.

BTW Why is an ERROR not a FAILURE?

Regards,

Jim Wright

--
Recently completed - Child Brain Injury Trust Admin System
http://cbitdemo.paneris.org/

Urgently seeking paid work
Java, Linux, XML and much more.
http://be.webz.cz/




Re: Help: ResultSet..insertRow() not coping with explicit

From
Kris Jurka
Date:

On Wed, 24 Sep 2003, Jim Wright wrote:
> ---
> src/interfaces/jdbc/org/postgresql/test/jdbc2/UpdateableResultTest.java.~1.7.~
> 2002-09-11 07:38:45.000000000 +0200
> +++
> src/interfaces/jdbc/org/postgresql/test/jdbc2/UpdateableResultTest.java
> 2003-09-24 07:19:39.000000000 +0200
> @@ -66,6 +66,17 @@
>
>              rs.close();
>
> +            rs = st.executeQuery( "select oid, * from updateable");
> +
> +            assertNotNull( rs );
> +            rs.moveToInsertRow();
> +            rs.updateInt( 1, 1 );
> +            rs.updateString( 2, "jim" );
> +            rs.updateString( 3, "4gotenit" );
> +            rs.insertRow();
> +
> +            rs.close();
> +
>              rs = st.executeQuery("select id1, id, name, name1 from
> updateable, second" );
>              try
>              {
>

Here the updateInt(1,1) is trying to update the oid column which is not
allowed and giving the error you see.

Kris Jurka


Re: Help: ResultSet..insertRow() not coping with explicit

From
Dave Cramer
Date:
Kris,

Thanks for finding that, considering I'm the one that put that code in I
should have picked it up. Anyways, yes, the oid bit is a postgres hack
that will make updateable result sets work if you don't have a primary
key.

Dave.

On Wed, 2003-09-24 at 20:08, Kris Jurka wrote:
> On Wed, 24 Sep 2003, Jim Wright wrote:
> > ---
> > src/interfaces/jdbc/org/postgresql/test/jdbc2/UpdateableResultTest.java.~1.7.~
> > 2002-09-11 07:38:45.000000000 +0200
> > +++
> > src/interfaces/jdbc/org/postgresql/test/jdbc2/UpdateableResultTest.java
> > 2003-09-24 07:19:39.000000000 +0200
> > @@ -66,6 +66,17 @@
> >
> >              rs.close();
> >
> > +            rs = st.executeQuery( "select oid, * from updateable");
> > +
> > +            assertNotNull( rs );
> > +            rs.moveToInsertRow();
> > +            rs.updateInt( 1, 1 );
> > +            rs.updateString( 2, "jim" );
> > +            rs.updateString( 3, "4gotenit" );
> > +            rs.insertRow();
> > +
> > +            rs.close();
> > +
> >              rs = st.executeQuery("select id1, id, name, name1 from
> > updateable, second" );
> >              try
> >              {
> >
>
> Here the updateInt(1,1) is trying to update the oid column which is not
> allowed and giving the error you see.
>
> Kris Jurka
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 7: don't forget to increase your free space map settings
>
--
Dave Cramer <Dave@micro-automation.net>


Re: Help: ResultSet..insertRow() not coping with explicit

From
Barry Lind
Date:
Jim,

Your test case is flawed.  Your select is essentially:

select oid, id, name, notselected from updateable;

Then you are binding the values for your insert positionally at
positions 1,2,3.  Which means you are binding value 1 to the oid column,
'jim' to the id column, '4gotenit' to the name column and nothing to the
notselected column.  If you change your indexes to be 2,3,4 everything
works correctly.  Or you could alternatively 'select *, oid from
updateable and continue binding from postion 1.

thanks,
--Barry


Jim Wright wrote:
> Hi Dave,
>
> Dave Cramer wrote:
>
>> Jim,
>>
>> can you send me a test case which demonstrates this?
>>
>>
> I have edited the JDBC test suite in my cvs working directory.
> I have not done a cvs update recently so note the version number.
> Additional comments follow:
>
> ---
> src/interfaces/jdbc/org/postgresql/test/jdbc2/UpdateableResultTest.java.~1.7.~
> 2002-09-11 07:38:45.000000000 +0200
> +++
> src/interfaces/jdbc/org/postgresql/test/jdbc2/UpdateableResultTest.java
> 2003-09-24 07:19:39.000000000 +0200
> @@ -66,6 +66,17 @@
>
>             rs.close();
>
> +            rs = st.executeQuery( "select oid, * from updateable");
> +
> +            assertNotNull( rs );
> +            rs.moveToInsertRow();
> +            rs.updateInt( 1, 1 );
> +            rs.updateString( 2, "jim" );
> +            rs.updateString( 3, "4gotenit" );
> +            rs.insertRow();                       +
> +            rs.close();
> +
>             rs = st.executeQuery("select id1, id, name, name1 from
> updateable, second" );
>             try
>             {
>
> My postgres installation was not built from this source:
>
>> On Mon, 2003-09-22 at 04:06, Jim Wright wrote:
>>
>>
>>> I have postgresql-7.3.1-6.src.rpm under Red Hat 8.0 and pg73jdbc3.jar.
>>>
>
> so it might conceivably work for you. Ant output:
>
> runtest:
>    [junit] Testsuite: org.postgresql.test.jdbc2.Jdbc2TestSuite
>    [junit] Tests run: 76, Failures: 1, Errors: 5, Time elapsed: 11.217 sec
>
>    [junit] Testcase:
> testUpdateable(org.postgresql.test.jdbc2.UpdateableResultTest):    FAILED
>    [junit] ERROR:  Relation "updateable" has no column "oid"
>    [junit] junit.framework.AssertionFailedError: ERROR:  Relation
> "updateable" has no column "oid"
>    [junit]     at
> org.postgresql.test.jdbc2.UpdateableResultTest.testUpdateable(UpdateableResultTest.java:143)
>
>    [junit]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native
> Method)
>    [junit]     at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>
>    [junit]     at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>
>
>
>    [junit] Testcase:
> testGetDouble(org.postgresql.test.jdbc2.CallableStmtTest):    Caused an
> ERROR
>    [junit] ERROR:  language "plpgsql" does not exist
>    [junit] java.sql.SQLException: ERROR:  language "plpgsql" does not exist
>    [junit]     at
> org.postgresql.core.QueryExecutor.executeV2(QueryExecutor.java:286)
>    [junit]     at
> org.postgresql.core.QueryExecutor.execute(QueryExecutor.java:104)
>    [junit]     at
> org.postgresql.core.QueryExecutor.execute(QueryExecutor.java:42)
>    [junit]     at
> org.postgresql.jdbc1.AbstractJdbc1Statement.execute(AbstractJdbc1Statement.java:437)
>
>    [junit]     at
> org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:49)
>
>    [junit]     at
> org.postgresql.jdbc1.AbstractJdbc1Statement.execute(AbstractJdbc1Statement.java:275)
>
>    [junit]     at
> org.postgresql.test.jdbc2.CallableStmtTest.setUp(CallableStmtTest.java:29)
>
> [snip 4 irrelevant errors similar to the last]
>
>    [junit] TEST org.postgresql.test.jdbc2.Jdbc2TestSuite FAILED
>    [junit] Testsuite: org.postgresql.test.jdbc2.optional.OptionalTestSuite
>    [junit] Tests run: 34, Failures: 0, Errors: 0, Time elapsed: 8.065 sec
>
>    [junit] Testsuite: org.postgresql.test.jdbc3.Jdbc3TestSuite
>    [junit] Tests run: 38, Failures: 0, Errors: 0, Time elapsed: 8.997 sec
>
> Hope that's all OK and if this is a valid test you have my permission
> to include it in the suite under the same license etc.
>
> BTW Why is an ERROR not a FAILURE?
>
> Regards,
>
> Jim Wright
>