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 dj...@apache.org on 2008/01/31 22:06:08 UTC

svn commit: r617238 - in /db/derby/code/trunk/java/engine/org/apache/derby: catalog/ catalog/types/ iapi/types/ impl/sql/compile/

Author: djd
Date: Thu Jan 31 13:06:03 2008
New Revision: 617238

URL: http://svn.apache.org/viewvc?rev=617238&view=rev
Log:
DERBY-2917 (partial) Cleanup of code relating to row multi-set types (used as the return type for Derby's table functions.
1) Add methods to the api (TypeDescriptor) side to fetch information about the row's types and column names, rather than have all callers have knowledge of the type implementation.
2) Treat a row multi-set type as only a catalog type (TypeDescriptor). Runtime types only make sense for the types of the individual columns (when used in a query).

Modified:
    db/derby/code/trunk/java/engine/org/apache/derby/catalog/GetProcedureColumns.java
    db/derby/code/trunk/java/engine/org/apache/derby/catalog/TypeDescriptor.java
    db/derby/code/trunk/java/engine/org/apache/derby/catalog/types/TypeDescriptorImpl.java
    db/derby/code/trunk/java/engine/org/apache/derby/iapi/types/DataTypeDescriptor.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/CreateAliasNode.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/FromVTI.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj

Modified: db/derby/code/trunk/java/engine/org/apache/derby/catalog/GetProcedureColumns.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/catalog/GetProcedureColumns.java?rev=617238&r1=617237&r2=617238&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/catalog/GetProcedureColumns.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/catalog/GetProcedureColumns.java Thu Jan 31 13:06:03 2008
@@ -33,7 +33,6 @@
 import org.apache.derby.iapi.sql.ResultColumnDescriptor;
 import org.apache.derby.impl.jdbc.EmbedResultSetMetaData;
 import org.apache.derby.catalog.types.RoutineAliasInfo;
-import org.apache.derby.catalog.types.RowMultiSetImpl;
 
 import org.apache.derby.shared.common.reference.JDBC40Translation;
 /**
@@ -107,7 +106,7 @@
 	private boolean isFunction;
 	private int          rowCount;
 	private int          returnedTableColumnCount;
-	private RowMultiSetImpl tableFunctionReturnType;
+	private TypeDescriptor tableFunctionReturnType;
     
 	// state for procedures.
 	private RoutineAliasInfo procedure;
@@ -144,8 +143,8 @@
             
 			rowCount = procedure.getParameterCount();
 			if ( procedure.isTableFunction() ) {
-			    tableFunctionReturnType = (RowMultiSetImpl) ((DataTypeDescriptor) procedure.getReturnType()).getTypeId().getBaseTypeId();
-			    returnedTableColumnCount = tableFunctionReturnType.getColumnNames().length;
+			    tableFunctionReturnType = procedure.getReturnType();
+			    returnedTableColumnCount = tableFunctionReturnType.getRowColumnNames().length;
 			    rowCount += returnedTableColumnCount;
 			    functionParamCursor = -1;
 		        }
@@ -175,8 +174,8 @@
 		if ( procedure.isTableFunction() && (  paramCursor >= procedure.getParameterCount() ) ) {
 			int     idx = paramCursor - procedure.getParameterCount();
             
-			sqlType      = tableFunctionReturnType.getTypes()[ idx ];
-			columnName   = tableFunctionReturnType.getColumnNames()[ idx ];
+			sqlType      = tableFunctionReturnType.getRowTypes()[ idx ];
+			columnName   = tableFunctionReturnType.getRowColumnNames()[ idx ];
 			columnType   = (short) JDBC40Translation.FUNCTION_COLUMN_RESULT;
 		}
 		else if (paramCursor > -1) {

Modified: db/derby/code/trunk/java/engine/org/apache/derby/catalog/TypeDescriptor.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/catalog/TypeDescriptor.java?rev=617238&r1=617237&r2=617238&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/catalog/TypeDescriptor.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/catalog/TypeDescriptor.java Thu Jan 31 13:06:03 2008
@@ -175,5 +175,23 @@
 	 * Return true if this is a Row Multiset type
 	  */
 	public	boolean isRowMultiSet();
+    
+    /**
+     * If this catalog type is a row multi-set type
+     * then return its array of catalog types.
+     * 
+     * @return Catalog ypes comprising the row,
+     * null if this is not a row type.
+     */
+    public TypeDescriptor[] getRowTypes();
+
+    /**
+     * If this catalog type is a row multi-set type
+     * then return its array of column names.
+     * 
+     * @return Column names comprising the row,
+     * null if this is not a row type.
+     */
+    public String[] getRowColumnNames();
 }
 

Modified: db/derby/code/trunk/java/engine/org/apache/derby/catalog/types/TypeDescriptorImpl.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/catalog/types/TypeDescriptorImpl.java?rev=617238&r1=617237&r2=617238&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/catalog/types/TypeDescriptorImpl.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/catalog/types/TypeDescriptorImpl.java Thu Jan 31 13:06:03 2008
@@ -398,7 +398,7 @@
 	 */
 	public	boolean isRowMultiSet()
 	{
-		return false;
+		return typeId instanceof RowMultiSetImpl;
 	}
 
 	/** @see TypeDescriptor#getCollationType() */
@@ -573,4 +573,18 @@
 	 *	@return	the formatID of this class
 	 */
 	public	int	getTypeFormatId()	{ return StoredFormatIds.DATA_TYPE_IMPL_DESCRIPTOR_V01_ID; }
+
+    public String[] getRowColumnNames() {
+        if (!isRowMultiSet())
+            return null;
+
+        return ((RowMultiSetImpl) typeId).getColumnNames();
+    }
+
+    public TypeDescriptor[] getRowTypes() {
+        if (!isRowMultiSet())
+            return null;
+
+        return ((RowMultiSetImpl) typeId).getTypes();
+    }
 }

Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/types/DataTypeDescriptor.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/iapi/types/DataTypeDescriptor.java?rev=617238&r1=617237&r2=617238&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/iapi/types/DataTypeDescriptor.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/iapi/types/DataTypeDescriptor.java Thu Jan 31 13:06:03 2008
@@ -323,14 +323,14 @@
 	}
     
 	/**
-	 * Get a DataTypeServices that corresponds to a SQL Row Multiset
+	 * Get a catalog type that corresponds to a SQL Row Multiset
 	 *
 	 * @param columnNames   Names of the columns in the Row Muliset
 	 * @param types                 Types of the columns in the Row Muliset
 	 *
 	 * @return	A new DataTypeDescriptor describing the SQL Row Multiset
 	 */
-	public static DataTypeDescriptor getRowMultiSet
+	public static TypeDescriptor getRowMultiSet
 	(
 		String[]	                        columnNames,
 		DataTypeDescriptor[]	types
@@ -343,7 +343,7 @@
 		RowMultiSetImpl rms = new RowMultiSetImpl(columnNames, catalogTypes);
 		TypeId              typeID = new TypeId( StoredFormatIds.ROW_MULTISET_CATALOG_ID, rms );
 
-		return new DataTypeDescriptor( typeID, true);
+		return new DataTypeDescriptor( typeID, true).getCatalogType();
 	}
 
 	/*
@@ -1749,6 +1749,20 @@
             name = name + " (" + getCollationName() + ")";
         }
         return name;    
+    }
+
+    // TEMP: DERBY-2917 - refactoring type system
+    public String[] getRowColumnNames() {
+        if (SanityManager.DEBUG)
+            SanityManager.THROWASSERT("Row type must always be a catalog type");
+        return null;
+    }
+
+    // TEMP: DERBY-2917 - refactoring type system
+    public TypeDescriptor[] getRowTypes() {
+        if (SanityManager.DEBUG)
+            SanityManager.THROWASSERT("Row type must always be a catalog type");
+        return null;
     }
 }
 

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/CreateAliasNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/CreateAliasNode.java?rev=617238&r1=617237&r2=617238&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/CreateAliasNode.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/CreateAliasNode.java Thu Jan 31 13:06:03 2008
@@ -40,7 +40,6 @@
 import org.apache.derby.catalog.AliasInfo;
 import org.apache.derby.catalog.TypeDescriptor;
 import org.apache.derby.catalog.types.RoutineAliasInfo;
-import org.apache.derby.catalog.types.RowMultiSetImpl;
 import org.apache.derby.catalog.types.SynonymAliasInfo;
 import org.apache.derby.catalog.types.TypeDescriptorImpl;
 
@@ -315,12 +314,11 @@
 		if ( aliasInfo.isTableFunction() )
         {
             RoutineAliasInfo    info = (RoutineAliasInfo) aliasInfo;
-            RowMultiSetImpl     tableFunctionReturnType = (RowMultiSetImpl) ((DataTypeDescriptor) info.getReturnType()).getTypeId().getBaseTypeId();
-            TypeDescriptor[]    types = tableFunctionReturnType.getTypes();
-            int                 returnedTableColumnCount = types.length;
+            TypeDescriptor[]    types = info.getReturnType().getRowTypes();
+
             SchemaDescriptor    sd = getSchemaDescriptor();
 
-            for ( int i = 0; i < returnedTableColumnCount; i++ )
+            for ( int i = 0; i < types.length; i++ )
             {
                 TypeDescriptorImpl  tdi = (TypeDescriptorImpl) types[ i ];
                 if ( tdi.isStringType() )

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/FromVTI.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/FromVTI.java?rev=617238&r1=617237&r2=617238&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/FromVTI.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/FromVTI.java Thu Jan 31 13:06:03 2008
@@ -62,7 +62,6 @@
 import org.apache.derby.catalog.TypeDescriptor;
 import org.apache.derby.catalog.UUID;
 import org.apache.derby.catalog.types.RoutineAliasInfo;
-import org.apache.derby.catalog.types.RowMultiSetImpl;
 
 import org.apache.derby.vti.DeferModification;
 import org.apache.derby.vti.VTICosting;
@@ -1595,13 +1594,9 @@
         (TypeDescriptor td)
         throws StandardException
     {
-        DataTypeDescriptor      returnType = (DataTypeDescriptor) td;
-        RowMultiSetImpl         rmsi = (RowMultiSetImpl) returnType.getTypeId().getBaseTypeId();
-        String[]                        columnNames = rmsi.getColumnNames();
-        TypeDescriptor[]    types = rmsi.getTypes();
-        int                                     count = columnNames.length;
-        
-        for ( int i = 0; i < count; i++ )
+        String[] columnNames = td.getRowColumnNames();
+        TypeDescriptor[] types = td.getRowTypes();
+        for ( int i = 0; i < columnNames.length; i++ )
         {
             resultColumns.addColumn( exposedName, columnNames[ i ],
                     DataTypeDescriptor.getType(types[i]));

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj?rev=617238&r1=617237&r2=617238&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj Thu Jan 31 13:06:03 2008
@@ -10135,14 +10135,14 @@
 functionDefinition() throws StandardException :
 {
 	TableName functionName;
-	DataTypeDescriptor  returnType;
+	TypeDescriptor  returnType;
 	Object[] functionElements = new Object[9];
 }
 {
 		<FUNCTION> functionName = qualifiedName(Limits.MAX_IDENTIFIER_LENGTH)
 		functionElements[0] = functionParameterList()
 		<RETURNS> returnType = functionReturnDataType() 
-		( routineElement(false, returnType.getTypeId().isRowMultiSetTypeId(), functionElements) ) +
+		( routineElement(false, returnType.isRowMultiSet(), functionElements) ) +
 		{
 		    functionElements[8] = returnType;
 		    checkRequiredRoutineClause(JAVA_ROUTINE_CLAUSES, functionElements);
@@ -10200,10 +10200,10 @@
 /*
  * <A NAME="functionReturnDataType">functionReturnDataType</A>
  */
-DataTypeDescriptor
+TypeDescriptor
 functionReturnDataType() throws StandardException :
 {
-    DataTypeDescriptor	typeDescriptor;
+    TypeDescriptor	typeDescriptor;
 }
 {
     (
@@ -10219,10 +10219,9 @@
 /*
  * <A NAME="functionTableType">functionTableType</A>
  */
-DataTypeDescriptor
+TypeDescriptor
 functionTableType() throws StandardException :
 {
-	DataTypeDescriptor      typeDescriptor;
 	ArrayList                       names = new ArrayList();
 	ArrayList                         types = new ArrayList();
 	String[]                          nameArray;
@@ -10255,9 +10254,7 @@
 		    { throw StandardException.newException( SQLState.LANG_XML_NOT_ALLOWED_DJRS ); }
 		}
 
-		typeDescriptor = DataTypeDescriptor.getRowMultiSet( nameArray, typeArray );
-
-		return typeDescriptor;
+		return DataTypeDescriptor.getRowMultiSet( nameArray, typeArray );
 	}
 }