db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Mamta A. Satoor (JIRA)" <derby-...@db.apache.org>
Subject [jira] Updated: (DERBY-1847) SELECT statement asserts with XJ001 when attempted to select a newly added column in SQL authorization mode
Date Tue, 03 Oct 2006 18:25:22 GMT
     [ http://issues.apache.org/jira/browse/DERBY-1847?page=all ]

Mamta A. Satoor updated DERBY-1847:
-----------------------------------

    Attachment: DERBY1846_V1_diff_AddColumnAndGrantRevoke.txt
                DERBY1846_V1_stat_AddColumnAndGrantRevoke.txt

I have attached a patch as DERBY1846_V1_diff_AddColumnAndGrantRevoke.txt
The output of svn stat -q is attached as DERBY1846_V1_stat_AddColumnAndGrantRevoke.txt

To recap the problem, in SQL Authorization mode, when a new column is added to a table, the
rows in SYSCOLPERMS for the table in question were not getting updated to incorporate the
new column. This caused ASSERT failure when a non-table owner attempted to select the new
column.

Some background information on system table involved: SYSCOLPERMS keeps track of column level
privileges on a given table. One of the columns in SYSCOLPERMS is "COLUMNS" and it has a bit
map to show which columns have the given permission granted on them. When a new column is
added to the user table, the "COLUMNS" need to be expanded by one bit and that bit should
be initialized to zero since no privileges have been granted on that column at the ALTER TABLE...ADD
COLUMN time.

I have fixed this problem by having AlterTableConstantAction.addNewColumnToTable call the
new method in DataDictionary called updateSYSCOLPERMSforAddColumnToUserTable. At this point,
we know of only the TableDescriptor's uuid which can help us determine all the rows in SYSCOLPERMS
for that given table uuid. I get ColPermsDescriptor for each one of those rows and then use
the ColPermsDescriptor's uuid to update the "COLUMNS" column so SYSCOLPERMS is aware of the
newly added column in user table. This fixes the problem because at the time of SELECT, when
we do privilege lookup in SYSCOLPERMS, we have info on the newly added column.

I have added few tests for this Jira entry in lang/grantRevokeDDL.sql The derbyall suite ran
fine on Windows XP with Sun's jdk 1.4

Any feedback will be greatly appreciated.

> SELECT statement asserts with XJ001 when attempted to select a newly added column in
SQL authorization mode
> -----------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-1847
>                 URL: http://issues.apache.org/jira/browse/DERBY-1847
>             Project: Derby
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 10.2.1.6, 10.3.0.0, 10.2.2.0
>         Environment: Any
>            Reporter: Yip Ng
>         Assigned To: Mamta A. Satoor
>         Attachments: DERBY1846_V1_diff_AddColumnAndGrantRevoke.txt, DERBY1846_V1_stat_AddColumnAndGrantRevoke.txt
>
>
> Following script causes the select statement below to assert in sane build. 
> ij> connect 'jdbc:derby:wombat;create=true' user 'user1' as user1;
> WARNING 01J14: SQL authorization is being used without first enabling authentication.
> ij> create table t1 (c1 int, c2 int);
> 0 rows inserted/updated/deleted
> ij> grant select(c1,c2) on t1 to user2;
> 0 rows inserted/updated/deleted
> ij> connect 'jdbc:derby:wombat;create=true' user 'user2' as user2;
> WARNING 01J01: Database 'wombat' not created, connection made to existing database instead.
> WARNING 01J14: SQL authorization is being used without first enabling authentication.
> ij(USER2)> set connection user1;
> ij(USER1)> alter table t1 add c3 int;
> 0 rows inserted/updated/deleted
> ij(USER1)> set connection user2;
> ij(USER2)> select c3 from user1.t1;
> ERROR XJ001: Java exception: 'ASSERT FAILED Attempt to get a bit position (2)that exceeds
the max length (2): org.apache.derby.shared.common.sanity.AssertFailure'.
> stack trace:
> org.apache.derby.shared.common.sanity.AssertFailure: ASSERT FAILED Attempt to get a bit
position (1)that exceeds the max length (1)
> 	at org.apache.derby.shared.common.sanity.SanityManager.THROWASSERT(SanityManager.java:149)
> 	at org.apache.derby.iapi.services.io.FormatableBitSet.isSet(FormatableBitSet.java:614)
> 	at org.apache.derby.iapi.services.io.FormatableBitSet.get(FormatableBitSet.java:643)
> 	at org.apache.derby.iapi.sql.dictionary.StatementColumnPermission.check(StatementColumnPermission.java:119)
> 	at org.apache.derby.impl.sql.conn.GenericAuthorizer.authorize(GenericAuthorizer.java:158)
> 	at org.apache.derby.exe.ac601a400fx010dxaa5bx09e8x00000013b9400.fillResultSet(Unknown
Source)
> 	at org.apache.derby.exe.ac601a400fx010dxaa5bx09e8x00000013b9400.execute(Unknown Source)
> 	at org.apache.derby.impl.sql.GenericActivationHolder.execute(GenericActivationHolder.java:327)
> 	at org.apache.derby.impl.sql.GenericPreparedStatement.execute(GenericPreparedStatement.java:356)
> 	at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(EmbedStatement.java:1182)
> 	at org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:585)
> 	at org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:517)
> 	at org.apache.derby.impl.tools.ij.ij.executeImmediate(ij.java:321)
> 	at org.apache.derby.impl.tools.ij.utilMain.doCatch(utilMain.java:517)
> 	at org.apache.derby.impl.tools.ij.utilMain.runScriptGuts(utilMain.java:370)
> 	at org.apache.derby.impl.tools.ij.utilMain.go(utilMain.java:268)
> 	at org.apache.derby.impl.tools.ij.Main.go(Main.java:204)
> 	at org.apache.derby.impl.tools.ij.Main.mainCore(Main.java:170)
> 	at org.apache.derby.impl.tools.ij.Main14.main(Main14.java:56)
> 	at org.apache.derby.tools.ij.main(ij.java:71)
> sysinfo:
> ------------------ Java Information ------------------
> Java Version:    1.4.2_12
> Java Vendor:     Sun Microsystems Inc.
> Java home:       C:\Program Files\Java\j2re1.4.2_12
> Java classpath:  classes;.
> OS name:         Windows XP
> OS architecture: x86
> OS version:      5.1
> Java user name:  Yip
> Java user home:  C:\Documents and Settings\Yip
> Java user dir:   C:\work3\derby\trunk
> java.specification.name: Java Platform API Specification
> java.specification.version: 1.4
> --------- Derby Information --------
> JRE - JDBC: J2SE 1.4.2 - JDBC 3.0
> [C:\work3\derby\trunk\classes] 10.3.0.0 alpha - (443080)
> ------------------------------------------------------
> ----------------- Locale Information -----------------
> Current Locale :  [English/United States [en_US]]
> Found support for locale: [de_DE]
>          version: 10.3.0.0 alpha - (443080)
> Found support for locale: [es]
>          version: 10.3.0.0 alpha - (443080)
> Found support for locale: [fr]
>          version: 10.3.0.0 alpha - (443080)
> Found support for locale: [it]
>          version: 10.3.0.0 alpha - (443080)
> Found support for locale: [ja_JP]
>          version: 10.3.0.0 alpha - (443080)
> Found support for locale: [ko_KR]
>          version: 10.3.0.0 alpha - (443080)
> Found support for locale: [pt_BR]
>          version: 10.3.0.0 alpha - (443080)
> Found support for locale: [zh_CN]
>          version: 10.3.0.0 alpha - (443080)
> Found support for locale: [zh_TW]
>          version: 10.3.0.0 alpha - (443080)
> ------------------------------------------------------

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Mime
View raw message