db-derby-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ma...@apache.org
Subject svn commit: r551950 - in /db/derby/code/branches/10.3/java: engine/org/apache/derby/impl/sql/compile/CreateAliasNode.java testing/org/apache/derbyTesting/functionTests/tests/lang/CollationTest.java
Date Fri, 29 Jun 2007 16:41:22 GMT
Author: mamta
Date: Fri Jun 29 09:41:21 2007
New Revision: 551950

URL: http://svn.apache.org/viewvc?view=rev&rev=551950
Log:
DERBY-2831 
Forgot to enter a test case during 551793 checkin. This commit just creates a function in
non-existent database to  ensure we don't throw null pointer exception.

In addition, this commit also makes sure that we associate correct collation information with
the character string parameters to procedures when the procedure gets created in CreateAliasNode.
We already do this for function but similar work needs to happen for procedures.


Modified:
    db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/compile/CreateAliasNode.java
    db/derby/code/branches/10.3/java/testing/org/apache/derbyTesting/functionTests/tests/lang/CollationTest.java

Modified: db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/compile/CreateAliasNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/compile/CreateAliasNode.java?view=diff&rev=551950&r1=551949&r2=551950
==============================================================================
--- db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/compile/CreateAliasNode.java
(original)
+++ db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/compile/CreateAliasNode.java
Fri Jun 29 09:41:21 2007
@@ -222,12 +222,13 @@
 
 	/**
 	 * CreateAliasNode creates the RoutineAliasInfo for a user defined function
-	 * in it's init method, which is called by the parser. But at that time, we
-	 * do not have the SchemaDescriptor ready to determine the collation
-	 * type. Hence, at the bind time, when we do have the SchemaDescriptor
-	 * available, we should go back and fix the RoutineAliasIno to have correct
-	 * collation for it's character string parameters and also fix it's return
-	 * type's collation if the return type is a character string.
+	 * or procedure in it's init method, which is called by the parser. But at 
+	 * that time, we do not have the SchemaDescriptor ready to determine the 
+	 * collation type. Hence, at the bind time, when we do have the 
+	 * SchemaDescriptor available, we should go back and fix the 
+	 * RoutineAliasInfo to have correct collation for its character string 
+	 * parameters and also fix its return type (for functions) so as to have 
+	 * correct collation if it is returning character string type. 
 	 * 
 	 * This method here checks if the RoutineAliasInfo has any character string
 	 * types associated with it. If not, then the RoutineAliasInfo that got
@@ -239,13 +240,17 @@
 	private boolean anyStringTypeDescriptor() {
 		RoutineAliasInfo rai = (RoutineAliasInfo)aliasInfo;
 		TypeDescriptor aType = rai.getReturnType();
+		TypeId compTypeId;
 		/*
 		** Try for a built in type matching the
 		** type name.  
 		*/
-		TypeId compTypeId = TypeId.getBuiltInTypeId(aType.getTypeName());
-		if (compTypeId != null && compTypeId.isStringTypeId()) 
-			return true;
+		if (aType != null) //that means we are not dealing with a procedure
+		{
+			compTypeId = TypeId.getBuiltInTypeId(aType.getTypeName());
+			if (compTypeId != null && compTypeId.isStringTypeId()) 
+				return true;			
+		}
 		if (rai.getParameterCount() != 0) {
 			int paramCount = rai.getParameterCount();
 			TypeDescriptor[] paramTypes = rai.getParameterTypes();
@@ -264,17 +269,23 @@
 	 * typeid, length and nullability to create a new DataTypeDescriptor and 
 	 * then have it take the collation type of the schema in which the method 
 	 * is getting defined in. This is because all the character strings 
-	 * associated with the definition of the user defined function should take  
-	 * the collation of the schema in which this user defined function is 
-	 * getting created.
+	 * associated with the definition of the user defined function/procedure 
+	 * should take the collation of the schema in which this user defined 
+	 * function is getting created.
 	 * 
 	 * @param changeTD TypeDescriptor with incorrect collation setting
 	 * @return New TypeDescriptor with collation of the schema in which 
-	 *   the function is getting created.
+	 *   the function/procedure is getting created.
 	 * @throws StandardException
 	 */
 	private TypeDescriptor typeDescriptorWithCorrectCollation(TypeDescriptor changeTD)
 	throws StandardException {
+		//We could have been called for the return type but for procedures 
+		//there is no return type and hence we should be careful that we
+		//don't run into null ptr exception. So before doing anything, check if
+		//the passed parameter is null and if so, then simply return.
+		if (changeTD == null) 
+			return changeTD;
 		TypeId compTypeId = TypeId.getBuiltInTypeId(changeTD.getTypeName());
 		//No work to do if type id does not correspond to a character string
 		if (compTypeId != null && compTypeId.isStringTypeId()) {
@@ -307,10 +318,11 @@
 
 	public void bindStatement() throws StandardException
 	{
-		//Are we dealing with user defined function?
-		if (aliasType == AliasInfo.ALIAS_TYPE_FUNCTION_AS_CHAR) {
-			//Does the user defined function have any character string types
-			//in it's definition
+		//Are we dealing with user defined function or procedure?
+		if (aliasType == AliasInfo.ALIAS_TYPE_FUNCTION_AS_CHAR ||
+				aliasType == AliasInfo.ALIAS_TYPE_PROCEDURE_AS_CHAR) {
+			//Does the user defined function/procedure have any character 
+			//string types in it's definition
 			if (anyStringTypeDescriptor()){
 				RoutineAliasInfo oldAliasInfo = (RoutineAliasInfo)aliasInfo;  
 				TypeDescriptor[] newParamTypes = null;
@@ -321,7 +333,7 @@
 					TypeDescriptor[] oldParamTypes = oldAliasInfo.getParameterTypes();
 					//Go through the parameters and pick the character string
 					//type and set their collation to the collation of the
-					//schema in which the function is getting defined.
+					//schema in which the function/procedure is getting defined.
 					for (int i = 0; i < paramCount; i++) 
 						newParamTypes[i] = typeDescriptorWithCorrectCollation(oldParamTypes[i]);
 				}

Modified: db/derby/code/branches/10.3/java/testing/org/apache/derbyTesting/functionTests/tests/lang/CollationTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.3/java/testing/org/apache/derbyTesting/functionTests/tests/lang/CollationTest.java?view=diff&rev=551950&r1=551949&r2=551950
==============================================================================
--- db/derby/code/branches/10.3/java/testing/org/apache/derbyTesting/functionTests/tests/lang/CollationTest.java
(original)
+++ db/derby/code/branches/10.3/java/testing/org/apache/derbyTesting/functionTests/tests/lang/CollationTest.java
Fri Jun 29 09:41:21 2007
@@ -718,7 +718,12 @@
 			"'org.apache.derbyTesting.functionTests.tests.lang.RoutineTest.concat' "+
 			" LANGUAGE JAVA PARAMETER STYLE JAVA");
     //DERBY-2831 Creating a function inside a non-existent schema should not
-    //fail when it's return type is of character string type.
+    //fail when it's return type is of character string type. Following is a
+    //simple test case copied from DERBY-2831
+    s.executeUpdate("CREATE FUNCTION AA.B() RETURNS VARCHAR(10) NO SQL " +
+    		"PARAMETER STYLE JAVA LANGUAGE JAVA EXTERNAL NAME 'aaa.bbb.ccc' ");
+    //following fails as expected because aaa.bbb.ccc doesn't exist 
+    assertStatementError("XJ001", s, "SELECT AA.B() FROM CUSTOMER ");
 
     //Start of parameter testing
     //Start with simple ? param in a string comparison



Mime
View raw message