[ 
https://issues.apache.org/jira/browse/DERBY-5244?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13147997#comment-13147997
 ] 

Mamta A. Satoor commented on DERBY-5244:
----------------------------------------

I debugged this issue and found that the problem is that for synonyms, we do 
not keep any rows in SYSCOLUMNS. It may have been a conscious implementation 
decision to do so because columns in synonyms are going to be same as the 
columns in underlying table/view. But metadata query associated with 
DatabaseMetaData.getColumns() does a join on SYSTABLES, SYSCOLUMNS AND 
SYSSCHEMA to get the list of columns but since there are no rows in SYSCOLUMNS, 
we always get an empty resultset for synonyms. Following is part of the query 
associated with getColumns in impl.jdbc.metadata.properties
        FROM SYS.SYSSCHEMAS S, \
                        SYS.SYSTABLES T, \
                        SYS.SYSCOLUMNS C \
        WHERE C.REFERENCEID = T.TABLEID AND S.SCHEMAID = T.SCHEMAID \
          AND ((1=1) OR ? IS NOT NULL) \
          AND (S.SCHEMANAME LIKE ?) AND (T.TABLENAME LIKE ?) AND (C.COLUMNNAME 
LIKE ?) \
        ORDER BY TABLE_SCHEM, TABLE_NAME, ORDINAL_POSITION


Java api for getColumns say that getColumns is called on 
tables(http://download.oracle.com/javase/6/docs/api/java/sql/DatabaseMetaData.html#getColumns(java.lang.String,
 java.lang.String, java.lang.String, java.lang.String)). Does it mean that it 
is ok for us to return empty resultset for synonyms? I did write a test for 
view and saw that we do return column information for views. I will commit the 
test for views soon.

Possible options are
1)modify the metadata query to include synonyms - not sure how easy that might 
be(or if it is doable at all)
2)add rows in syscolumns(for existing databases, we can do this at the time of 
upgrade) so we know that the existing metadata query will work
3)see if we can tweak EmbedDatabaseMetaData.getColumns method to do something 
special for synonyms. Again, since we send a pattern for tablename to 
getColumns, I am not sure how we will be able to handle tables, views and 
synonyms starting with the given table name pattern,
4)I did some google search on synonyms and getColumns and found that both DB2 
and Oracle it appears require a special knob to be set to true(the knob is not 
same for the 2 databases) before getColumns will start returning rows for 
synonyms. 
For DB2, it is an optional connection property CatalogIncludesSynonyms  {true | 
false}. When set to true, synonyms are included in the result sets returned 
from the following DatabaseMetaData methods: getColumns, getProcedureColumns, 
and getIndexInfo. When set to false, synonyms are omitted from result sets. The 
default is true.
For Oracle, it is a connection level property too, a property named 
"includeSynonyms" can be set to "true" to DriverManager.getConnection. 

                
> DatabaseMetaData.getColumns(null, null, tableName, null) does not return the 
> columns meta for a SYNONYM
> -------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-5244
>                 URL: https://issues.apache.org/jira/browse/DERBY-5244
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC
>    Affects Versions: 10.8.1.2
>         Environment: Windows
>            Reporter: Prashanth Godey
>            Priority: Minor
>              Labels: SYNONYM, getColumns
>
> DatabaseMetaData.getColumns(null, null, tableName, null) does not return the 
> columns meta for a SYNONYM.
> Sample java code use for testing.
> /**
>  * ListColumns.java
>  */
> import java.sql.*;
> import java.util.Properties;
> public class ListColumns {
>       public static void main(String[] args) {
>               Connection con = null;
>               try {
>                       Class.forName("org.apache.derby.jdbc.ClientDriver");
>                       
>                       Properties connectionProps = new Properties();
>                       connectionProps.put("user", "app");
>                       connectionProps.put("password", "app");
>                       
>                       con = DriverManager.getConnection(
>                                       
> "jdbc:derby://localhost:1527/northwind", connectionProps);
>                       String tableName = "V1";
>                       DatabaseMetaData meta = con.getMetaData();
>                       System.out.println("Database Product Version"
>                                       + meta.getDatabaseProductVersion());
>                       ResultSet res = meta.getColumns(null, null, tableName, 
> null);
>                       System.out.println("List of columns for " + tableName);
>                       while (res.next()) {
>                               System.out.println("  " + 
> res.getString("TABLE_SCHEM") + ", "
>                                               + res.getString("TABLE_NAME") + 
> ", "
>                                               + res.getString("COLUMN_NAME") 
> + ", "
>                                               + res.getString("TYPE_NAME") + 
> ", "
>                                               + res.getInt("COLUMN_SIZE") + 
> ", "
>                                               + res.getString("NULLABLE"));
>                       }
>                       res.close();
>                       con.close();
>               } catch (java.lang.ClassNotFoundException e) {
>                       System.err.println("ClassNotFoundException: " + 
> e.getMessage());
>               } catch (SQLException e) {
>                       System.err.println("SQLException: " + e.getMessage());
>               }
>       }
> }

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to