Hi, I have sent 2 patches for Derby engine code in the past(and they are already commited) in preparation for making updatable resultset functionality available in Network Server mode. Here is another patch to make progress towards that goal.
The problem is that Derby does not return correct values for ResultSetMetaData.getSchemaName and ResultSetMetaData.isWritable. And these 2 methods are crucial to have updatable resultset functionality under Network Server mode. Following is the description of the issue from Jira "Derby Net Client and JCC driver rely on getSchemanName method to construct the correct "update where current of sql" for an updatRow. For eg, if the user is in say schema s1 and the updatable resultset is issued on a table from schema s2 with the sql "select c11 from s2.t1 for update". Currenly, getSchemaName returns null and hence, the client code constructs a sql like "update t1 ... where current of ...". ie the update is being issued against table t1 in schema s1. getSchemaName should return s2, so the driver can correctly genereat sql as "update s2.t1 ... where current of ...". In addition, the client code lets a user issue an updateXXX on a column only if the column is writable and it determines that by looking at the return value of isWritable(). Derby engine currently always returns false for this method and because of that, updateXXX fails in Network Server mode. Derby should return true for the columns which can be updated in the given resultset. For eg for "select c11, c12 from t1 for update of c11", isWritable should return true for c11 and false for c12. " Most of the changes in this patch are to add methods and variables related to schema name and writable status to columns so they are available correctly to EmbedResultSetMetaData.java. These changes went into ResultColumn.java, VirtualColumnNode.java, BaseColumnNode.java, ColumnReference.java, ValueNode.java, GenericColumnDescriptor.java, ColumnDescriptor.java, ResultColumnDescriptor.java CursorNode.java currently marks the columns updatable in FromTable object only. The columns need to be marked correctly in ResultSetColumnList associated with the cursor also. That is what the change in CursorNode.java does. ResultColumnList.java currently doesn't handle marking columns updatable for the column list associated with a cursor node. Added markColumnsInSelectListUpdatableByCursor method to handle that. Change in EmbedResultSet.java is to catch updateXXX on read-only columns of the resultset. Have added test for this. Change in EmbedResultSetMetaData.java is have isWritable method return the column's updatableByCursor state. And to call the correct schema name method on the column in getSchemaName method. svn stat M java\engine\org\apache\derby\impl\sql\compile\ResultColumn.java M java\engine\org\apache\derby\impl\sql\compile\VirtualColumnNode.java M java\engine\org\apache\derby\impl\sql\compile\CursorNode.java M java\engine\org\apache\derby\impl\sql\compile\BaseColumnNode.java M java\engine\org\apache\derby\impl\sql\compile\ColumnReference.java M java\engine\org\apache\derby\impl\sql\compile\ValueNode.java M java\engine\org\apache\derby\impl\sql\compile\ResultColumnList.java M java\engine\org\apache\derby\impl\sql\GenericColumnDescriptor.java M java\engine\org\apache\derby\impl\jdbc\EmbedResultSet.java M java\engine\org\apache\derby\impl\jdbc\EmbedResultSetMetaData.java M java\engine\org\apache\derby\iapi\sql\dictionary\ColumnDescriptor.java M java\engine\org\apache\derby\iapi\sql\ResultColumnDescriptor.java M java\testing\org\apache\derbyTesting\functionTests\tests\lang\updatableResultSet.java M java\testing\org\apache\derbyTesting\functionTests\master\DerbyNet\updatableResultSet.out M java\testing\org\apache\derbyTesting\functionTests\master\DerbyNet\resultset.out M java\testing\org\apache\derbyTesting\functionTests\master\DerbyNetClient\updatableResultSet.out M java\testing\org\apache\derbyTesting\functionTests\master\DerbyNetClient\resultset.out M java\testing\org\apache\derbyTesting\functionTests\master\updatableResultSet.out M java\testing\org\apache\derbyTesting\functionTests\master\jdk14\updatableResultSet.out M java\testing\org\apache\derbyTesting\functionTests\master\resultset.out If no objection from anyone, can a commiter commit this patch? thanks, Mamta
