You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by rh...@apache.org on 2009/12/12 02:22:51 UTC

svn commit: r889876 - in /db/derby/code/trunk/java: engine/org/apache/derby/impl/sql/compile/ testing/org/apache/derbyTesting/functionTests/tests/lang/

Author: rhillegas
Date: Sat Dec 12 01:22:50 2009
New Revision: 889876

URL: http://svn.apache.org/viewvc?rev=889876&view=rev
Log:
DERBY-651: Add dependencies of views on UDTs.

Modified:
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/QueryTreeNode.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/StaticMethodCallNode.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/ValueNode.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/Price.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/UDTTest.java

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/QueryTreeNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/QueryTreeNode.java?rev=889876&r1=889875&r2=889876&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/QueryTreeNode.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/QueryTreeNode.java Sat Dec 12 01:22:50 2009
@@ -1639,6 +1639,21 @@
     }
 
     /**
+     * Declare a dependency on a type. This is only used if the type is an ANSI UDT.
+     *
+     * @param dtd Type which may have a dependency declared on it.
+     */
+    public void createTypeDependency( DataTypeDescriptor dtd ) throws StandardException
+    {
+        AliasDescriptor ad = getDataDictionary().getAliasDescriptorForUDT( null, dtd );
+
+        if ( ad != null )
+        {
+            getCompilerContext().createDependency( ad );
+        }
+    }
+    
+    /**
      * Common code for the 2 checkReliability functions.  Always throws StandardException.
      *
      * @param fragmentType Type of fragment as a string, for inclusion in error messages.

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/StaticMethodCallNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/StaticMethodCallNode.java?rev=889876&r1=889875&r2=889876&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/StaticMethodCallNode.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/StaticMethodCallNode.java Sat Dec 12 01:22:50 2009
@@ -271,6 +271,10 @@
 				optimizeDomainValueConversion();
 			
 			TypeDescriptor returnType = routineInfo.getReturnType();
+
+            // create type dependency if return type is an ANSI UDT
+            if ( returnType != null ) { createTypeDependency( DataTypeDescriptor.getType( returnType ) ); }
+
 			if ( returnType != null && !returnType.isRowMultiSet() && !returnType.isUserDefinedType() )
 			{
 				TypeId returnTypeId = TypeId.getBuiltInTypeId(returnType.getJDBCTypeId());

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/ValueNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/ValueNode.java?rev=889876&r1=889875&r2=889876&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/ValueNode.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/ValueNode.java Sat Dec 12 01:22:50 2009
@@ -287,6 +287,9 @@
 	public void setType(DataTypeDescriptor dataTypeServices) throws StandardException
 	{
 		this.dataTypeServices = dataTypeServices;
+
+        // create a dependency on this type if it is an ANSI UDT
+        if ( dataTypeServices != null ) { createTypeDependency( dataTypeServices ); }
 	}
 	
 	/**

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/Price.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/Price.java?rev=889876&r1=889875&r2=889876&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/Price.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/Price.java Sat Dec 12 01:22:50 2009
@@ -46,6 +46,7 @@
     public Timestamp timeInstant;
 
     // methods to be registered as functions
+    public static Price makePrice( ) { return new Price( "USD", new BigDecimal( 1 ), DEFAULT_TIMESTAMP ); }
     public static Price makePrice( String currencyCode, BigDecimal amount, Timestamp timeInstant ) { return new Price( currencyCode, amount, timeInstant ); }
     public static String getCurrencyCode( Price price ) { return price.currencyCode; }
     public static BigDecimal getAmount( Price price ) { return price.amount; }

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/UDTTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/UDTTest.java?rev=889876&r1=889875&r2=889876&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/UDTTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/UDTTest.java Sat Dec 12 01:22:50 2009
@@ -52,6 +52,7 @@
     public static final String NONEXISTENT_OBJECT = "42Y55";
     public static final String SYNTAX_ERROR = "42X01";
     public static final String TABLE_DEPENDS_ON_TYPE = "X0Y29";
+    public static final String VIEW_DEPENDS_ON_TYPE = "X0Y23";
 
     ///////////////////////////////////////////////////////////////////////////////////
     //
@@ -412,6 +413,68 @@
               "drop type price_orphan4 restrict\n" );
     }
     
+    /**
+     * <p>
+     * Dependencies of views on UDTs.
+     * </p>
+     */
+    public void test_05_viewDependencies() throws Exception
+    {
+        Connection conn = getConnection();
+
+        // view with UDT in select list
+        goodStatement
+            ( conn,
+              "create type price_05_a external name 'org.apache.derbyTesting.functionTests.tests.lang.Price' language java\n" );
+        goodStatement
+            (
+             conn,
+             "create function makePrice_05( )\n" +
+             "returns price_05_a language java parameter style java no sql\n" +
+             "external name 'org.apache.derbyTesting.functionTests.tests.lang.Price.makePrice'\n"
+              );
+        goodStatement
+            (
+             conn,
+             "create view udtView( a, b, c ) as\n" +
+             "select tabletype, makePrice_05( ), makePrice_05( )\n" +
+             "from sys.systables\n"
+              );
+        expectExecutionError( conn, VIEW_DEPENDS_ON_TYPE, "drop type price_05_a restrict\n" );
+        goodStatement
+            ( conn,
+              "drop view udtView\n" );
+        goodStatement
+            ( conn,
+              "drop type price_05_a restrict\n" );
+
+        // view with UDT in where clause
+        goodStatement
+            ( conn,
+              "create type price_05_b external name 'org.apache.derbyTesting.functionTests.tests.lang.Price' language java\n" );
+        goodStatement
+            (
+             conn,
+             "create function makePrice_05_b( )\n" +
+             "returns price_05_b language java parameter style java no sql\n" +
+             "external name 'org.apache.derbyTesting.functionTests.tests.lang.Price.makePrice'\n"
+              );
+        goodStatement
+            (
+             conn,
+             "create view udtView_b( a ) as\n" +
+             "select tabletype from sys.systables where makePrice_05_b() is not null\n"
+              );
+        expectExecutionError( conn, VIEW_DEPENDS_ON_TYPE, "drop type price_05_b restrict\n" );
+        goodStatement
+            ( conn,
+              "drop view udtView_b\n" );
+        goodStatement
+            ( conn,
+              "drop type price_05_b restrict\n" );
+
+    }
+
     ///////////////////////////////////////////////////////////////////////////////////
     //
     // MINIONS