Mamta Satoor wrote:
Hi,
I noticed that PreparedStatement.executeQuery(like several other JDBC methods) sets up the context stack by calling setupContextStack in EmbeddedStatement's executeStatement method(line 1118). But when setXXX methods are called on PreparedStatement, we do not create a context stack. Why do we not need the context setting for setXXX methods?

Pushing and popping the context stack is an expensive operation, requiring to do this on every setXXX() call would have a severe performance impact on Derby. Setting (and getting) values should be simply setting a value in a DataValueDescriptor and thus has no need to setup the context.

The reason for my question is I ran following simple query in ij
connect 'jdbc:derby:c:/dellater/db1';
CREATE TABLE TSTAB (I int, STATUS_TS  Timestamp, PROPERTY_TS Timestamp);
prepare p as 'select STATUS_TS  from tstab where status_ts = ?';
execute p using 'values (''20'')';
When trying to debug through the last statement above ***execute p using 'values (''20'')';***, I found that we reach SQLTimestamp.setValue(String theValue) method. In this method, we try to determine the locale by going through the Context stack but since none was setup for setXXX methods, we always use a null locale irrespective of what territory the database was created with. That doesn't seem like the right thing to do and the reason this is happening is because no context stack was set up for this particular JDBC api.

Sounds like a bug. I do think that the existing code that obtains the locale is approaching the problem in entirely the wrong way and probably should be written from scratch. E.g. if a data type is locale dependent for its string conversion then it should have a setValue(String) method that has an additional argument that specifies the locale (either as a Locale, a LocaleFinder or some other effective object).

Dan.

Reply via email to