Thread: modification required to pass Sun's CTS

modification required to pass Sun's CTS

From
Dave Cramer
Date:
The cts calls executeUpdate on a function with out parameters.

I know the API says that executeUpdate is only to be used when no
results are expected,
but this is the way the test is.


Any thoughts on changing executeUpdate to allow results to be returned?

Dave


Dave Cramer
davec@postgresintl.com
www.postgresintl.com
ICQ #14675561
jabber davecramer@jabber.org
ph (519 939 0336 )


Re: modification required to pass Sun's CTS

From
Oliver Jowett
Date:
Dave Cramer wrote:
> The cts calls executeUpdate on a function with out parameters.
>
> I know the API says that executeUpdate is only to be used when no
> results are expected,
> but this is the way the test is.
>
>
> Any thoughts on changing executeUpdate to allow results to be returned?

That's almost certainly the wrong thing to do. executeUpdate is quite
specific about throwing exceptions when a resultset is returned.

I think the confusion arises from JDBC not considering an OUT parameter
to be a "result". i.e. you can have a function with OUT parameters that
returns a resultset, but equally you can have one that doesn't return a
resultset; and the values in the resultset (if any) are separate to the
returned OUT parameter values.

Given that the backend OUT parameter support is implemented as a
resultset, maybe it makes sense to hide the resultset of a function with
OUT parameters entirely, since it's really an implementation artifact?
Then executeUpdate shouldn't need changes.

Does the CTS have the reverse case, i.e. requiring a function that has
both OUT parameters and a resultset? Seems like that'd be hard to
support at all with the current scheme..

-O

Re: modification required to pass Sun's CTS

From
Dave Cramer
Date:
Oliver,

This is what we have to pass.

   rsSch.createTab("Numeric_Tab",sqlp,conn);

                         msg.setMsg("get the CallableStatement object");
                         cstmt = conn.prepareCall("{call Numeric_Proc
(?,?,?)}");

                         msg.setMsg("Register the output parameter");
                         cstmt.registerOutParameter
(1,java.sql.Types.NUMERIC,15);
                         cstmt.registerOutParameter
(2,java.sql.Types.NUMERIC,15);
                         cstmt.registerOutParameter
(3,java.sql.Types.NUMERIC,15);

                         msg.setMsg("execute the procedure");
                         cstmt.executeUpdate();
                         msg.setMsg("invoke getBigDecimal method");
                         oRetVal = cstmt.getBigDecimal(1);
                         String sRetStr = rsSch.extractVal
("Numeric_Tab",1,sqlp,conn);
                         msg.setMsg("extracted MAX_VAL from
Numeric_Tab");
                         maxBigDecimalVal = new BigDecimal(sRetStr);

                         msg.addOutputMsg("" + maxBigDecimalVal, "" +
oRetVal);

                         if( (oRetVal.compareTo(maxBigDecimalVal) ==
0) )
                         {
                                 msg.setMsg("getBigDecimal returns
the Maximum value ");
                         }
                         else
                         {
                                 msg.printTestError("getBigDecimal()
did not return the Maximum value", "test getBigDecimal Failed!");

                         }



On 1-Jun-05, at 5:37 PM, Oliver Jowett wrote:

> Dave Cramer wrote:
>
>> The cts calls executeUpdate on a function with out parameters.
>> I know the API says that executeUpdate is only to be used when no
>> results are expected,
>> but this is the way the test is.
>> Any thoughts on changing executeUpdate to allow results to be
>> returned?
>>
>
> That's almost certainly the wrong thing to do. executeUpdate is
> quite specific about throwing exceptions when a resultset is returned.
>
> I think the confusion arises from JDBC not considering an OUT
> parameter to be a "result". i.e. you can have a function with OUT
> parameters that returns a resultset, but equally you can have one
> that doesn't return a resultset; and the values in the resultset
> (if any) are separate to the returned OUT parameter values.
>
> Given that the backend OUT parameter support is implemented as a
> resultset, maybe it makes sense to hide the resultset of a function
> with OUT parameters entirely, since it's really an implementation
> artifact? Then executeUpdate shouldn't need changes.
>
> Does the CTS have the reverse case, i.e. requiring a function that
> has both OUT parameters and a resultset? Seems like that'd be hard
> to support at all with the current scheme..
>
> -O
>
>



Dave Cramer
davec@postgresintl.com
www.postgresintl.com
ICQ #14675561
jabber davecramer@jabber.org
ph (519 939 0336 )


Re: modification required to pass Sun's CTS

From
Oliver Jowett
Date:
Dave Cramer wrote:

>                         cstmt = conn.prepareCall("{call Numeric_Proc
> (?,?,?)}");
>
>                         msg.setMsg("Register the output parameter");
>                         cstmt.registerOutParameter
> (1,java.sql.Types.NUMERIC,15);
>                         cstmt.registerOutParameter
> (2,java.sql.Types.NUMERIC,15);
>                         cstmt.registerOutParameter
> (3,java.sql.Types.NUMERIC,15);
>
>                         msg.setMsg("execute the procedure");
>                         cstmt.executeUpdate();

Ok, so that is exactly the case I was talking about, a procedure that
doesn't return a value or resultset, but has OUT parameters. We should
mask the resultset we get from the backend in this case as it's just an
implementation detail of our OUT mechanism. (i.e. executeUpdate() does
not complain, executeQuery() does complain, etc)

-O

Re: modification required to pass Sun's CTS

From
Dave Cramer
Date:
Oliver,

OK, so if I understand this correctly, we allow the OUT parameter
result set if it is a callablestatement ?
I don't think we can actually return two resultsets ie one for the
out parameters, and yet another if the function returns a resultset.
I don't believe the
backend has this facility.
On 1-Jun-05, at 9:34 PM, Oliver Jowett wrote:

> Dave Cramer wrote:
>
>
>>                         cstmt = conn.prepareCall("{call
>> Numeric_Proc (?,?,?)}");
>>                         msg.setMsg("Register the output parameter");
>>                         cstmt.registerOutParameter
>> (1,java.sql.Types.NUMERIC,15);
>>                         cstmt.registerOutParameter
>> (2,java.sql.Types.NUMERIC,15);
>>                         cstmt.registerOutParameter
>> (3,java.sql.Types.NUMERIC,15);
>>                         msg.setMsg("execute the procedure");
>>                         cstmt.executeUpdate();
>>
>
> Ok, so that is exactly the case I was talking about, a procedure
> that doesn't return a value or resultset, but has OUT parameters.
> We should mask the resultset we get from the backend in this case
> as it's just an implementation detail of our OUT mechanism. (i.e.
> executeUpdate() does not complain, executeQuery() does complain, etc)
>
> -O
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 2: you can get off all lists at once with the unregister command
>    (send "unregister YourEmailAddressHere" to
> majordomo@postgresql.org)
>
>


Re: modification required to pass Sun's CTS

From
Oliver Jowett
Date:
Dave Cramer wrote:

> OK, so if I understand this correctly, we allow the OUT parameter
> result set if it is a callablestatement ?

No. I guess I'm not being clear.

If you have a function that does not return anything, but has OUT
parameters, then CallableStatement.executeUpdate() should succeed and
CallableStatement.executeQuery() should fail. That is, the fact that we
use a SELECT to get at the OUT parameters is an *implementation detail*
-- from the point of view of the JDBC {call} escape, the function is
*not* returning a resultset.

So the driver's implementation of OUT parameters should also make sure
to suppress the resultset generated by the SELECT. From the point of
view of the JDBC client, execution of the {call} escape *does not return
a resultset*. That means that executeUpdate() doesn't complain about it,
and executeQuery() *does* complain about it, and you can't get access to
any resultset via getResultSet() etc.  If you want to get the OUT
values, you use the appropriate parameter-getting methods on
CallableStatement.

> I don't think we can actually return two resultsets ie one for the  out
> parameters, and yet another if the function returns a resultset.  I
> don't believe the
> backend has this facility.

Yes, that's what I said in my earlier email.

-O