db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Shreyas Kaushik <Shreyas.Kaus...@Sun.COM>
Subject Re: [PATCH]Derby-229
Date Wed, 04 May 2005 13:32:41 GMT
Hi Lance,

I'm sorry I missed this mail yesterday. I should have been more clear 
the blurb is from the Derby codeline , sorry for this

~ Shreyas



Lance J. Andersen wrote:

> Hi Shreyas,
>
> Which codeline was blurb below that you cut and pasted from as I did 
> not see the blurb below in the javadocs for 
> supportsMixedCaseQuotedIdentifiers.
>
>
>       supportsMixedCaseQuotedIdentifiers
>
>public boolean *supportsMixedCaseQuotedIdentifiers*()
>                                           throws SQLException <http://java.sun.com/j2se/1.4.2/docs/api/java/sql/SQLException.html>
>
>     Retrieves whether this database treats mixed case quoted SQL
>     identifiers as case sensitive and as a result stores them in mixed
>     case. 
>
>     *Returns:*
>         |true| if so; |false| otherwise 
>     *Throws:*
>         |SQLException
>         <http://java.sun.com/j2se/1.4.2/docs/api/java/sql/SQLException.html>|
>         - if a database access error occurs
>
>
>
> However the tutorial (3rd edition) does indicate a compliant driver is 
> true.
>
> The JDBC spec does not mention this in the compliance section.  Looks 
> like another issue I need to clarify for JDBC 4.0.
>
> Regards
> Lance
>
>
>
> Shreyas Kaushik wrote:
>
>> Does the JDBC spec say anything about this ? I did not find anything 
>> that mandates this or says if this return false the driver is not 
>> JDBC compliant.
>>
>> On the contrary the comment says,
>>
>>   /**
>>     * Does the database treat mixed case unquoted SQL identifiers as
>>     * case sensitive and as a result store them in mixed case?
>>     *
>>     * A JDBC-Compliant driver will always return false.
>>     *
>>     * @return true if so
>>     */
>>
>> Lance, can you help us out here ?
>>
>> ~ Shreyas
>>
>> Bernt M. Johnsen wrote:
>>
>>> Hi all,
>>>
>>> I have the following comment to this patch. This solves the problem of
>>> getting the *first* matching column instead of the *last*.
>>>
>>> But: Since DatabaseMetaData.supportsMixedCaseQuotedIdentifiers()
>>> return true (which is a requirement to JDBC compliant drivers), it
>>> should be possible to do e.g. getXXX("\"quotedId\"") to get the column
>>> which exactly matches "quotedId". (Alternatively,
>>> supportsMixedCaseQuotedIdentifiers() could return false, but then the
>>> driver would not be JDBC compliant).
>>>
>>> If this is considered a new Jira issue I'd willingly file and fix it
>>> (need developer status though).
>>>
>>> Bernt
>>>
>>>  
>>>
>>>>>>>>>>>>>>> Shreyas Kaushik wrote (2005-05-02
11:43:27):
>>>>>>>>>>>>>>>                         
>>>>>>>>>>>>>>
>>>> Hi,
>>>>
>>>> This is the latest patch.
>>>> I have taken care of comments from Mamta and Dan. Please let me 
>>>> know if I have missed anything.
>>>>
>>>> ~ Shreyas
>>>>   
>>>
>>>
>>>  
>>>
>>>> Index: 
>>>> /drivers/derby/trunk/java/testing/org/apache/derbyTesting/functionTests/master/caseInsensitiveColumn.out

>>>>
>>>> ===================================================================
>>>> --- 
>>>> /drivers/derby/trunk/java/testing/org/apache/derbyTesting/functionTests/master/caseInsensitiveColumn.out
   
>>>> (revision 0)
>>>> +++ 
>>>> /drivers/derby/trunk/java/testing/org/apache/derbyTesting/functionTests/master/caseInsensitiveColumn.out
   
>>>> (revision 0)
>>>> @@ -0,0 +1,9 @@
>>>> +Test caseInsensitiveColumn starting
>>>> +Before updation...
>>>> +ResultSet is: 1
>>>> +ResultSet is: 346
>>>> +After update...
>>>> +Column Number 1: 900
>>>> +Column Number 2: 346
>>>> +Col COL1: 900
>>>> +Col col1: 900
>>>> Index: java/engine/org/apache/derby/impl/jdbc/EmbedResultSet.java
>>>> ===================================================================
>>>> --- java/engine/org/apache/derby/impl/jdbc/EmbedResultSet.java    
>>>> (revision 165091)
>>>> +++ java/engine/org/apache/derby/impl/jdbc/EmbedResultSet.java    
>>>> (working copy)
>>>> @@ -3591,8 +3591,14 @@
>>>>         ResultDescription rd = resultDescription;
>>>>
>>>>         // 1 or 0 based? assume 1 (probably wrong)
>>>> -        for (int i=rd.getColumnCount(); i>=1; i--) {
>>>> +        // Changing the order in which columns are found from 1 
>>>> till column count.
>>>> +        // This is necessary in cases where the column names are 
>>>> the same but are in different cases.
>>>> +        // This is because in updateXXX and getXXX methods column 
>>>> names are case insensitive
>>>> +        // and in that case the first column should be returned.
>>>> +        +        int columnCount = rd.getColumnCount();
>>>>
>>>> +        for(int i = 1 ; i<= columnCount;i++) {
>>>>             String name = rd.getColumnDescriptor(i).getName();
>>>>             if (StringUtil.SQLEqualsIgnoreCase(columnName, name)) {
>>>>                 return i;
>>>> Index: 
>>>> /drivers/derby/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/caseInsensitiveColumn.java

>>>>
>>>> ===================================================================
>>>> --- 
>>>> /drivers/derby/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/caseInsensitiveColumn.java
   
>>>> (revision 0)
>>>> +++ 
>>>> /drivers/derby/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/caseInsensitiveColumn.java
   
>>>> (revision 0)
>>>> @@ -0,0 +1,97 @@
>>>> +package org.apache.derbyTesting.functionTests.tests.jdbcapi;
>>>> +
>>>> +
>>>> +import java.sql.*;
>>>> +
>>>> +import org.apache.derby.tools.ij;
>>>> +import org.apache.derby.tools.JDBCDisplayUtil;
>>>> +
>>>> +public class caseInsensitiveColumn {
>>>> +
>>>> +    public static void main(String[] args) {
>>>> +        test1(args);
>>>> +    }
>>>> +    +        public static void test1(String []args) {   
>>>> +                Connection con;
>>>> +                ResultSet rs;
>>>> +                Statement stmt = null;
>>>> +                PreparedStatement stmt1 = null;
>>>> +
>>>> +                System.out.println("Test caseInsensitiveColumn 
>>>> starting");
>>>> +
>>>> +                try
>>>> +                {
>>>> +                        // use the ij utility to read the property 
>>>> file and
>>>> +                        // make the initial connection.
>>>> +                        ij.getPropertyArg(args);
>>>> +                        con = ij.startJBMS();
>>>> +                   
>>>> +            
>>>> con.setAutoCommit(false);                                               
  
>>>> +
>>>> +                        stmt = con.createStatement(); +
>>>> +            // create a table with two columns, their names differ 
>>>> in they being in different cases.
>>>> +                        stmt.executeUpdate("create table 
>>>> caseiscol(COL1 int ,\"col1\" int)");
>>>> +
>>>> +               con.commit();
>>>> +              
>>>> +            stmt.executeUpdate("insert into caseiscol values 
>>>> (1,346)");
>>>> +
>>>> +            con.commit();
>>>> +
>>>> +                        // select data from this table for updating
>>>> +            stmt1 = con.prepareStatement("select COL1, \"col1\" 
>>>> from caseiscol FOR UPDATE",ResultSet.TYPE_FORWARD_ONLY, 
>>>> ResultSet.CONCUR_UPDATABLE);
>>>> +                rs = stmt1.executeQuery();
>>>> +
>>>> +            // Get the data and disply it before updating.
>>>> +                        System.out.println("Before updation...");
>>>> +            while(rs.next()) {
>>>> +               System.out.println("ResultSet is: "+rs.getObject(1));
>>>> +               System.out.println("ResultSet is: "+rs.getObject(2));
>>>> +            }
>>>> +                        rs.close();
>>>> +            rs = stmt1.executeQuery();
>>>> +            while(rs.next()) {
>>>> +               // Update the two columns with different data.
>>>> +               // Since update is case insensitive only the first 
>>>> column should get updated in both cases.
>>>> +               rs.updateInt("col1",100);
>>>> +               rs.updateInt("COL1",900);
>>>> +               rs.updateRow();
>>>> +            }
>>>> +            rs.close();
>>>> +
>>>> +            System.out.println("After update...");
>>>> +            rs = stmt1.executeQuery();
>>>> +
>>>> +            // Display the data after updating. Only the first 
>>>> column should have the updated value.
>>>> +            while(rs.next()) {
>>>> +               System.out.println("Column Number 1: "+rs.getInt(1));
>>>> +               System.out.println("Column Number 2: "+rs.getInt(2));
>>>> +            }
>>>> +            rs.close();
>>>> +            rs = stmt1.executeQuery();
>>>> +            while(rs.next()) {
>>>> +               // Again checking for case insensitive behaviour 
>>>> here, should display the data in the first column.
>>>> +               System.out.println("Col COL1: "+rs.getInt("COL1"));
>>>> +               System.out.println("Col col1: "+rs.getInt("col1"));
>>>> +            }
>>>> +            rs.close();
>>>> +         } catch(SQLException sqle) {
>>>> +            dumpSQLExceptions(sqle);
>>>> +            sqle.printStackTrace();
>>>> +         } catch(Throwable e) {
>>>> +            System.out.println("FAIL -- unexpected exception: "+e);
>>>> +                   e.printStackTrace();
>>>> +
>>>> +         }
>>>> +     }
>>>> +     +     static private void dumpSQLExceptions (SQLException se) {
>>>> +                System.out.println("FAIL -- unexpected exception");
>>>> +                while (se != null) {
>>>> +                        
>>>> System.out.println("SQLSTATE("+se.getSQLState()+"): "+se);
>>>> +                        se = se.getNextException();
>>>> +                }
>>>> +        }
>>>> +}       
>>>
>>>
>>>
>>>  
>>>

Mime
View raw message