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 2007/10/29 18:43:36 UTC

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

Author: rhillegas
Date: Mon Oct 29 10:43:34 2007
New Revision: 589766

URL: http://svn.apache.org/viewvc?rev=589766&view=rev
Log:
DERBY-3119: Commit James Adams patch for resolving functions which return the Java object versions of the primitive datatypes.

Modified:
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/MethodCallNode.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/RoutineTest.java

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/MethodCallNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/MethodCallNode.java?rev=589766&r1=589765&r2=589766&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/MethodCallNode.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/MethodCallNode.java Mon Oct 29 10:43:34 2007
@@ -792,14 +792,6 @@
 			}
 			else
 			{
-
-
-				// DB2 LUW does not support Java object types for SMALLINT, INTEGER, BIGINT, REAL, DOUBLE
-				// and these are the only types that can map to a primitive or an object type according
-				// to SQL part 13. So always map to the primitive type. We can not use the getPrimitiveSignature()
-				// as it (incorrectly but historically always has) maps a DECIMAL to a double. 
-
-				
 				TypeId returnTypeId = TypeId.getBuiltInTypeId(returnType.getJDBCTypeId());
 
 				if (
@@ -811,24 +803,24 @@
 				}
 				else
 				{
-				    switch (returnType.getJDBCTypeId()) {
-				    case java.sql.Types.SMALLINT:
-				    case java.sql.Types.INTEGER:
-				    case java.sql.Types.BIGINT:
-				    case java.sql.Types.REAL:
-				    case java.sql.Types.DOUBLE:
-				    	TypeCompiler tc = getTypeCompiler(returnTypeId);
-				    	requiredType = tc.getCorrespondingPrimitiveTypeName();
-				    	if (!routineInfo.calledOnNullInput() && routineInfo.getParameterCount() != 0)
-				    	{
-				    		promoteName = returnTypeId.getCorrespondingJavaTypeName();
-				    	}
+			 		requiredType = returnTypeId.getCorrespondingJavaTypeName();
 
-				    	break;
-				    default:
-				    	requiredType = returnTypeId.getCorrespondingJavaTypeName();
-				    	break;
-				    }
+					if (!requiredType.equals(typeName)) {
+						switch (returnType.getJDBCTypeId()) {
+						case java.sql.Types.SMALLINT:
+						case java.sql.Types.INTEGER:
+						case java.sql.Types.BIGINT:
+						case java.sql.Types.REAL:
+						case java.sql.Types.DOUBLE:
+							TypeCompiler tc = getTypeCompiler(returnTypeId);
+							requiredType = tc.getCorrespondingPrimitiveTypeName();
+							if (!routineInfo.calledOnNullInput() && routineInfo.getParameterCount() != 0)
+							{
+								promoteName = returnTypeId.getCorrespondingJavaTypeName();
+							}
+							break;
+						}
+					}
 				}
 			}
 

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/RoutineTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/RoutineTest.java?rev=589766&r1=589765&r2=589766&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/RoutineTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/RoutineTest.java Mon Oct 29 10:43:34 2007
@@ -55,6 +55,119 @@
         return new CleanDatabaseTestSetup(suite);
     }
     
+    
+    /**
+     * Test that function result data types are resolved correctly for numeric
+     * types that Derby supports that are simply mappable or object mappable.
+     */
+    public void testFunctionResultDataTypeValidation() throws SQLException
+    {
+        Statement s = createStatement();
+
+        // SMALLINT -> short
+        s.executeUpdate(
+        "CREATE FUNCTION SMALLINT_P_SHORT(VARCHAR(10)) RETURNS SMALLINT " +
+           "EXTERNAL NAME 'java.lang.Short.parseShort' " +
+           "LANGUAGE JAVA PARAMETER STYLE JAVA");
+
+        PreparedStatement ps = prepareStatement("VALUES SMALLINT_P_SHORT(?)");
+        ps.setString(1, "123");
+        JDBC.assertSingleValueResultSet(ps.executeQuery(), "123");  
+
+        // SMALLINT -> Integer
+        s.executeUpdate(
+        "CREATE FUNCTION SMALLINT_O_INTEGER(VARCHAR(10)) RETURNS SMALLINT " +
+           "EXTERNAL NAME 'java.lang.Integer.valueOf' " +
+           "LANGUAGE JAVA PARAMETER STYLE JAVA");
+
+        ps = prepareStatement("VALUES SMALLINT_O_INTEGER(?)");
+        ps.setString(1, "123");
+        JDBC.assertSingleValueResultSet(ps.executeQuery(), "123");  
+
+        // INTEGER -> int
+        s.executeUpdate(
+        "CREATE FUNCTION INTEGER_P_INT(VARCHAR(10)) RETURNS INTEGER " +
+           "EXTERNAL NAME 'java.lang.Integer.parseInt' " +
+           "LANGUAGE JAVA PARAMETER STYLE JAVA");
+
+        ps = prepareStatement("VALUES INTEGER_P_INT(?)");
+        ps.setString(1, "123");
+        JDBC.assertSingleValueResultSet(ps.executeQuery(), "123");  
+
+        // INTEGER -> Integer
+        s.executeUpdate(
+        "CREATE FUNCTION INTEGER_O_INTEGER(VARCHAR(10)) RETURNS INTEGER " +
+           "EXTERNAL NAME 'java.lang.Integer.valueOf' " +
+           "LANGUAGE JAVA PARAMETER STYLE JAVA");
+
+        ps = prepareStatement("VALUES INTEGER_O_INTEGER(?)");
+        ps.setString(1, "123");
+        JDBC.assertSingleValueResultSet(ps.executeQuery(), "123");  
+
+        // BIGINT -> long
+        s.executeUpdate(
+        "CREATE FUNCTION BIGINT_P_LONG(VARCHAR(10)) RETURNS BIGINT " +
+           "EXTERNAL NAME 'java.lang.Long.parseLong' " +
+           "LANGUAGE JAVA PARAMETER STYLE JAVA");
+
+        ps = prepareStatement("VALUES BIGINT_P_LONG(?)");
+        ps.setString(1, "123");
+        JDBC.assertSingleValueResultSet(ps.executeQuery(), "123");  
+
+        // BIGINT -> Long
+        s.executeUpdate(
+        "CREATE FUNCTION BIGINT_O_LONG(VARCHAR(10)) RETURNS BIGINT " +
+           "EXTERNAL NAME 'java.lang.Long.valueOf' " +
+           "LANGUAGE JAVA PARAMETER STYLE JAVA");
+
+        ps = prepareStatement("VALUES BIGINT_O_LONG(?)");
+        ps.setString(1, "123");
+        JDBC.assertSingleValueResultSet(ps.executeQuery(), "123");  
+
+        // REAL -> float
+        s.executeUpdate(
+        "CREATE FUNCTION REAL_P_FLOAT(VARCHAR(10)) RETURNS REAL " +
+           "EXTERNAL NAME 'java.lang.Float.parseFloat' " +
+           "LANGUAGE JAVA PARAMETER STYLE JAVA");
+
+        ps = prepareStatement("VALUES REAL_P_FLOAT(?)");
+        ps.setString(1, "123.0");
+        JDBC.assertSingleValueResultSet(ps.executeQuery(), "123.0");  
+
+        // REAL -> Float
+        s.executeUpdate(
+        "CREATE FUNCTION REAL_O_FLOAT(VARCHAR(10)) RETURNS REAL " +
+           "EXTERNAL NAME 'java.lang.Float.valueOf' " +
+           "LANGUAGE JAVA PARAMETER STYLE JAVA");
+
+        ps = prepareStatement("VALUES REAL_O_FLOAT(?)");
+        ps.setString(1, "123.0");
+        JDBC.assertSingleValueResultSet(ps.executeQuery(), "123.0");  
+
+        // DOUBLE -> double
+        s.executeUpdate(
+        "CREATE FUNCTION DOUBLE_P_DOUBLE(VARCHAR(10)) RETURNS DOUBLE " +
+           "EXTERNAL NAME 'java.lang.Double.parseDouble' " +
+           "LANGUAGE JAVA PARAMETER STYLE JAVA");
+
+        ps = prepareStatement("VALUES DOUBLE_P_DOUBLE(?)");
+        ps.setString(1, "123.0");
+        JDBC.assertSingleValueResultSet(ps.executeQuery(), "123.0");  
+
+        // DOBULE -> Double
+        s.executeUpdate(
+        "CREATE FUNCTION DOUBLE_O_DOUBLE(VARCHAR(10)) RETURNS DOUBLE " +
+           "EXTERNAL NAME 'java.lang.Double.valueOf' " +
+           "LANGUAGE JAVA PARAMETER STYLE JAVA");
+
+        ps = prepareStatement("VALUES DOUBLE_O_DOUBLE(?)");
+        ps.setString(1, "123.0");
+        JDBC.assertSingleValueResultSet(ps.executeQuery(), "123.0");
+        
+        ps.close();
+        s.close();
+    }
+    
     /**
      * Test that functions handle being called or not called
      * when it is passed a NULL argument correctly.