[ 
https://issues.apache.org/jira/browse/DERBY-4829?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Knut Anders Hatlen updated DERBY-4829:
--------------------------------------

    Attachment: derby-4829-1a.diff

Here's a patch with a fix and a test case.

Description of the changes:

* impl/tools/dblook/DB_GrantRevoke.java:

generateColumnPrivs:
Use a prepared statement instead of a statement so that the schema name and 
table name can be parameters. This avoids the trouble with having to quote them 
as string literals with single quotes. (We still need to quote them as 
identifiers with double quotes some places, but that was done correctly in the 
existing code.)

generateColumnPrivs:
Also remember to close the statement and result set.

mapColumnsToNames:
Quote the column names in the generated GRANT statement.

columnPrivStatement:
Add the missing "ON <schema name>.<table name>" part of the generated GRANT 
statement.

* tests/tools/dblook_makeDB.sql:

Created table with special characters in name/columns and granted column 
privileges. Without the fix, this made the different variants of dblook_test 
fail because the dblook error log was not empty, and also because the dblook 
output got some extra statements.

* functionTests/master/**/dblook_test*.out:

Updated the canons for the dblook_test variants so that they expect the extra 
output caused by the new database objects added in dblook_makeDB.sql. Some of 
the canons also got this error text added, because of the bug in the table 
exclusion logic mentioned in my previous comment:

+FAILED: to execute cmd from DDL script:
+GRANT SELECT("'Single' and ""double"" quoted column name") ON "'Single' and 
""double"" quoted schema name"."'Single' and ""double"" quoted table name" TO 
"SOMEONE"
+Schema ''Single' and "double" quoted schema name' does not exist

I have only run the following tests yet:

tools/dblook_test.java
tools/dblook_test_territory.java
derbynet/dblook_test_net.java (client and JCC)
derbynet/dblook_test_net_territory.java (client and JCC)

I'll run the full regression test suite and come back with the results.

> dblook fails if there is a column privilege on a table whose name contains a 
> quote
> ----------------------------------------------------------------------------------
>
>                 Key: DERBY-4829
>                 URL: https://issues.apache.org/jira/browse/DERBY-4829
>             Project: Derby
>          Issue Type: Bug
>          Components: Tools
>    Affects Versions: 10.6.2.1
>            Reporter: Knut Anders Hatlen
>            Assignee: Knut Anders Hatlen
>            Priority: Minor
>         Attachments: derby-4829-1a.diff
>
>
> Create a table with a column privilege like this in ij:
> connect 'jdbc:derby:db;create=true';
> call 
> syscs_util.syscs_set_database_property('derby.database.sqlAuthorization', 
> 'true');
> create table """" (x int);
> disconnect;
> connect 'jdbc:derby:db;shutdown=true';
> connect 'jdbc:derby:db';
> grant select (x) on """" to someone;
> exit;
> If you then run dblook -d jdbc:derby:db, you'll see this:
> -- ----------------------------------------------
> -- GRANT statements for columns
> -- ----------------------------------------------
> -- Note: At least one unexpected error/warning message was
> -- encountered during DDL generation.  See dblook.log
> -- to review the message(s).
> And in dblook.log you'll find this:
> java.sql.SQLException: Invalid cursor state - no current row.
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
>       at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
>       at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.EmbedConnection.newSQLException(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.ConnectionChild.newSQLException(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.EmbedResultSet.checkOnRow(Unknown Source)
>       at org.apache.derby.impl.jdbc.EmbedResultSet.getColumn(Unknown Source)
>       at org.apache.derby.impl.jdbc.EmbedResultSet.getString(Unknown Source)
>       at 
> org.apache.derby.impl.tools.dblook.DB_GrantRevoke.mapColumnsToNames(Unknown 
> Source)
>       at 
> org.apache.derby.impl.tools.dblook.DB_GrantRevoke.columnPrivStatement(Unknown 
> Source)
>       at 
> org.apache.derby.impl.tools.dblook.DB_GrantRevoke.generateColumnPrivs(Unknown 
> Source)
>       at 
> org.apache.derby.impl.tools.dblook.DB_GrantRevoke.doAuthorizations(Unknown 
> Source)
>       at org.apache.derby.tools.dblook.go(Unknown Source)
>       at org.apache.derby.tools.dblook.<init>(Unknown Source)
>       at org.apache.derby.tools.dblook.main(Unknown Source)
> Caused by: java.sql.SQLException: Invalid cursor state - no current row.
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown
>  Source)
>       ... 16 more
> -- **--> DEBUG: Invalid cursor state - no current row.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to