You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-dev@db.apache.org by "Mike Matrigali (JIRA)" <de...@db.apache.org> on 2005/08/17 01:19:55 UTC

[jira] Updated: (DERBY-85) NPE when creating a trigger on a table and default schema doesn't exist.

     [ http://issues.apache.org/jira/browse/DERBY-85?page=all ]

Mike Matrigali updated DERBY-85:
--------------------------------

      Component: SQL
    Description: 
BACKGROUND:

When connecting to a Derby db with a user id and password, the default schema is USER.  For example, if I connect with:

ij> connect 'jdbc:derby:myDB;user=someUser;password=somePwd';

then the default schema is "SOMEUSER".

PROBLEM:

It turns out that if a table t1 exists in a non-default schema and the default schema (in this case, "SOMEUSER") doesn't exist yet (because no objects have been created in that schema), then attempts to create a trigger on t1 using its qualified name will lead to a null pointer exception in the Derby engine.

REPRO:

In ij:

-- Create database with default schema "SOMEUSER".
ij> connect 'jdbc:derby:myDB;create=true;user=someUser;password=somePwd';

-- Create table t1 in a non-default schema; in this case, call it "ITKO".
ij> create table itko.t1 (i int);
0 rows inserted/updated/deleted

-- Now schema ITKO exists, and T1 exists in schema ITKO, but default schema SOMEUSER does NOT exist, because we haven't created any objects in that schema yet.

-- So now we try to create a trigger in the ITKO (i.e. the non-default) schema...
ij> create trigger trig1 after update on itko.t1 for each row mode db2sql select * from sys.systables;
ERROR XJ001: Java exception: ': java.lang.NullPointerException'.

A look at the derby.log file shows the stack trace given below.  In a word, it looks like the "compilation schema" field of SYS.SYSTRIGGERS isn't getting set, and so it ends up being null.  That causes the NPE in subsequent processing...

java.lang.NullPointerException
	at org.apache.derby.impl.sql.catalog.SYSSTATEMENTSRowFactory.makeSYSSTATEMENTSrow(SYSSTATEMENTSRowFactory.java:200)
	at org.apache.derby.impl.sql.catalog.DataDictionaryImpl.addSPSDescriptor(DataDictionaryImpl.java:2890)
	at org.apache.derby.impl.sql.execute.CreateTriggerConstantAction.createSPS(CreateTriggerConstantAction.java:354)
	at org.apache.derby.impl.sql.execute.CreateTriggerConstantAction.executeConstantAction(CreateTriggerConstantAction.java:258)
	at org.apache.derby.impl.sql.execute.MiscResultSet.open(MiscResultSet.java:56)
	at org.apache.derby.impl.sql.GenericPreparedStatement.execute(GenericPreparedStatement.java:366)
	at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(EmbedStatement.java:1100)
	at org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:509)
	at org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:467)
	at org.apache.derby.impl.tools.ij.ij.executeImmediate(ij.java:299)
	at org.apache.derby.impl.tools.ij.utilMain.doCatch(utilMain.java:433)
	at org.apache.derby.impl.tools.ij.utilMain.go(utilMain.java:310)
	at org.apache.derby.impl.tools.ij.Main.go(Main.java:210)
	at org.apache.derby.impl.tools.ij.Main.mainCore(Main.java:176)
	at org.apache.derby.impl.tools.ij.Main14.main(Main14.java:56)
	at org.apache.derby.tools.ij.main(ij.java:60)

  was:
BACKGROUND:

When connecting to a Derby db with a user id and password, the default schema is USER.  For example, if I connect with:

ij> connect 'jdbc:derby:myDB;user=someUser;password=somePwd';

then the default schema is "SOMEUSER".

PROBLEM:

It turns out that if a table t1 exists in a non-default schema and the default schema (in this case, "SOMEUSER") doesn't exist yet (because no objects have been created in that schema), then attempts to create a trigger on t1 using its qualified name will lead to a null pointer exception in the Derby engine.

REPRO:

In ij:

-- Create database with default schema "SOMEUSER".
ij> connect 'jdbc:derby:myDB;create=true;user=someUser;password=somePwd';

-- Create table t1 in a non-default schema; in this case, call it "ITKO".
ij> create table itko.t1 (i int);
0 rows inserted/updated/deleted

-- Now schema ITKO exists, and T1 exists in schema ITKO, but default schema SOMEUSER does NOT exist, because we haven't created any objects in that schema yet.

-- So now we try to create a trigger in the ITKO (i.e. the non-default) schema...
ij> create trigger trig1 after update on itko.t1 for each row mode db2sql select * from sys.systables;
ERROR XJ001: Java exception: ': java.lang.NullPointerException'.

A look at the derby.log file shows the stack trace given below.  In a word, it looks like the "compilation schema" field of SYS.SYSTRIGGERS isn't getting set, and so it ends up being null.  That causes the NPE in subsequent processing...

java.lang.NullPointerException
	at org.apache.derby.impl.sql.catalog.SYSSTATEMENTSRowFactory.makeSYSSTATEMENTSrow(SYSSTATEMENTSRowFactory.java:200)
	at org.apache.derby.impl.sql.catalog.DataDictionaryImpl.addSPSDescriptor(DataDictionaryImpl.java:2890)
	at org.apache.derby.impl.sql.execute.CreateTriggerConstantAction.createSPS(CreateTriggerConstantAction.java:354)
	at org.apache.derby.impl.sql.execute.CreateTriggerConstantAction.executeConstantAction(CreateTriggerConstantAction.java:258)
	at org.apache.derby.impl.sql.execute.MiscResultSet.open(MiscResultSet.java:56)
	at org.apache.derby.impl.sql.GenericPreparedStatement.execute(GenericPreparedStatement.java:366)
	at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(EmbedStatement.java:1100)
	at org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:509)
	at org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:467)
	at org.apache.derby.impl.tools.ij.ij.executeImmediate(ij.java:299)
	at org.apache.derby.impl.tools.ij.utilMain.doCatch(utilMain.java:433)
	at org.apache.derby.impl.tools.ij.utilMain.go(utilMain.java:310)
	at org.apache.derby.impl.tools.ij.Main.go(Main.java:210)
	at org.apache.derby.impl.tools.ij.Main.mainCore(Main.java:176)
	at org.apache.derby.impl.tools.ij.Main14.main(Main14.java:56)
	at org.apache.derby.tools.ij.main(ij.java:60)

    Environment: 

> NPE when creating a trigger on a table and default schema doesn't exist.
> ------------------------------------------------------------------------
>
>          Key: DERBY-85
>          URL: http://issues.apache.org/jira/browse/DERBY-85
>      Project: Derby
>         Type: Bug
>   Components: SQL
>     Versions: 10.0.2.0
>     Reporter: A B
>     Assignee: Dyre Tjeldvoll
>  Attachments: derby-85-notabs.diff, derby-85.diff, derby-85.stat, derbyall_report.txt
>
> BACKGROUND:
> When connecting to a Derby db with a user id and password, the default schema is USER.  For example, if I connect with:
> ij> connect 'jdbc:derby:myDB;user=someUser;password=somePwd';
> then the default schema is "SOMEUSER".
> PROBLEM:
> It turns out that if a table t1 exists in a non-default schema and the default schema (in this case, "SOMEUSER") doesn't exist yet (because no objects have been created in that schema), then attempts to create a trigger on t1 using its qualified name will lead to a null pointer exception in the Derby engine.
> REPRO:
> In ij:
> -- Create database with default schema "SOMEUSER".
> ij> connect 'jdbc:derby:myDB;create=true;user=someUser;password=somePwd';
> -- Create table t1 in a non-default schema; in this case, call it "ITKO".
> ij> create table itko.t1 (i int);
> 0 rows inserted/updated/deleted
> -- Now schema ITKO exists, and T1 exists in schema ITKO, but default schema SOMEUSER does NOT exist, because we haven't created any objects in that schema yet.
> -- So now we try to create a trigger in the ITKO (i.e. the non-default) schema...
> ij> create trigger trig1 after update on itko.t1 for each row mode db2sql select * from sys.systables;
> ERROR XJ001: Java exception: ': java.lang.NullPointerException'.
> A look at the derby.log file shows the stack trace given below.  In a word, it looks like the "compilation schema" field of SYS.SYSTRIGGERS isn't getting set, and so it ends up being null.  That causes the NPE in subsequent processing...
> java.lang.NullPointerException
> 	at org.apache.derby.impl.sql.catalog.SYSSTATEMENTSRowFactory.makeSYSSTATEMENTSrow(SYSSTATEMENTSRowFactory.java:200)
> 	at org.apache.derby.impl.sql.catalog.DataDictionaryImpl.addSPSDescriptor(DataDictionaryImpl.java:2890)
> 	at org.apache.derby.impl.sql.execute.CreateTriggerConstantAction.createSPS(CreateTriggerConstantAction.java:354)
> 	at org.apache.derby.impl.sql.execute.CreateTriggerConstantAction.executeConstantAction(CreateTriggerConstantAction.java:258)
> 	at org.apache.derby.impl.sql.execute.MiscResultSet.open(MiscResultSet.java:56)
> 	at org.apache.derby.impl.sql.GenericPreparedStatement.execute(GenericPreparedStatement.java:366)
> 	at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(EmbedStatement.java:1100)
> 	at org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:509)
> 	at org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:467)
> 	at org.apache.derby.impl.tools.ij.ij.executeImmediate(ij.java:299)
> 	at org.apache.derby.impl.tools.ij.utilMain.doCatch(utilMain.java:433)
> 	at org.apache.derby.impl.tools.ij.utilMain.go(utilMain.java:310)
> 	at org.apache.derby.impl.tools.ij.Main.go(Main.java:210)
> 	at org.apache.derby.impl.tools.ij.Main.mainCore(Main.java:176)
> 	at org.apache.derby.impl.tools.ij.Main14.main(Main14.java:56)
> 	at org.apache.derby.tools.ij.main(ij.java:60)

-- 
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