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 kr...@apache.org on 2008/09/11 10:00:13 UTC

svn commit: r694166 - in /db/derby/code/trunk/java/engine/org/apache/derby/impl: jdbc/EmbedDatabaseMetaData.java sql/catalog/DataDictionaryImpl.java sql/compile/sqlgrammar.jj

Author: kristwaa
Date: Thu Sep 11 01:00:13 2008
New Revision: 694166

URL: http://svn.apache.org/viewvc?rev=694166&view=rev
Log:
DERBY-3063: Extend the system function mechanism to support functions with multiple arguments.
Added support for system functions with several arguments.
Added numberic function ATAN2 (used the one in StrictMath).
Patch file: derby-3063-2a.diff

Modified:
    db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/DataDictionaryImpl.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/impl/jdbc/EmbedDatabaseMetaData.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData.java?rev=694166&r1=694165&r2=694166&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData.java Thu Sep 11 01:00:13 2008
@@ -455,7 +455,7 @@
      * @return the list
      */
 	public String getNumericFunctions() {
-		return "ABS,ACOS,ASIN,ATAN,CEILING,COS,COT,DEGREES,EXP,FLOOR,LOG,LOG10,MOD,PI,RADIANS,RAND,SIGN,SIN,SQRT,TAN";
+		return "ABS,ACOS,ASIN,ATAN,ATAN2,CEILING,COS,COT,DEGREES,EXP,FLOOR,LOG,LOG10,MOD,PI,RADIANS,RAND,SIGN,SIN,SQRT,TAN";
 	}
 
     /**

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/DataDictionaryImpl.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/DataDictionaryImpl.java?rev=694166&r1=694165&r2=694166&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/DataDictionaryImpl.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/DataDictionaryImpl.java Thu Sep 11 01:00:13 2008
@@ -205,24 +205,25 @@
 	* returns a CHAR(10).
 	* 
 	* 
-	* This simple table assumes zero or a single parameter
+    * This simple table can handle an arbitrary number of arguments
 	* and RETURNS NULL ON NULL INPUT. The scheme could be expanded
 	* to handle other function options such as other parameters if needed.
-	*[0] = FUNCTION name
-	*[1] = RETURNS type
-	*[2] = Java class
-	*[3] = method name and signature
-	*[4] = parameter type (single parameter) or null for no parameters.
+    *[0]    = FUNCTION name
+    *[1]    = RETURNS type
+    *[2]    = Java class
+    *[3]    = method name and signature
+    *[4..N] = arguments (optional, if not present zero arguments is assumed)
 	*
 	*/
 	private static final String[][] SYSFUN_FUNCTIONS = {
 			{"ACOS", "DOUBLE", "java.lang.StrictMath", "acos(double)", "DOUBLE"},
 			{"ASIN", "DOUBLE", "java.lang.StrictMath", "asin(double)", "DOUBLE"},
 			{"ATAN", "DOUBLE", "java.lang.StrictMath", "atan(double)", "DOUBLE"},
+            {"ATAN2", "DOUBLE", "java.lang.StrictMath", "atan2(double,double)", "DOUBLE", "DOUBLE"},
 			{"COS", "DOUBLE", "java.lang.StrictMath", "cos(double)", "DOUBLE"},
 			{"SIN", "DOUBLE", "java.lang.StrictMath", "sin(double)", "DOUBLE"},
 			{"TAN", "DOUBLE", "java.lang.StrictMath", "tan(double)", "DOUBLE"},
-			{"PI", "DOUBLE", "org.apache.derby.catalog.SystemProcedures", "PI()", null},
+            {"PI", "DOUBLE", "org.apache.derby.catalog.SystemProcedures", "PI()"},
 			{"DEGREES", "DOUBLE", "java.lang.StrictMath", "toDegrees(double)", "DOUBLE"},
 			{"RADIANS", "DOUBLE", "java.lang.StrictMath", "toRadians(double)", "DOUBLE"},
 			{"LN", "DOUBLE", "java.lang.StrictMath", "log(double)", "DOUBLE"},
@@ -233,7 +234,7 @@
 			{"CEILING", "DOUBLE", "java.lang.StrictMath", "ceil(double)", "DOUBLE"}, // Same as CEIL
 			{"FLOOR", "DOUBLE", "java.lang.StrictMath", "floor(double)", "DOUBLE"},
 			{"SIGN", "INTEGER", "org.apache.derby.catalog.SystemProcedures", "SIGN(double)", "DOUBLE"},
-			{"RANDOM", "DOUBLE", "java.lang.StrictMath", "random()", null},
+            {"RANDOM", "DOUBLE", "java.lang.StrictMath", "random()"},
 			{"RAND", "DOUBLE", "org.apache.derby.catalog.SystemProcedures", "RAND(int)", "INTEGER"}, // Escape function spec.
 			{"COT", "DOUBLE", "org.apache.derby.catalog.SystemProcedures", "COT(double)", "DOUBLE"},
 			{"COSH", "DOUBLE", "org.apache.derby.catalog.SystemProcedures", "COSH(double)", "DOUBLE"},
@@ -241,22 +242,19 @@
 			{"TANH", "DOUBLE", "org.apache.derby.catalog.SystemProcedures", "TANH(double)", "DOUBLE"}
 	};
 	
+
+    /**
+     * The index of the first parameter in entries in the SYSFUN_FUNCTIONS
+     * table. Used to determine the parameter count (zero to many).
+     */
+    private static final int SYSFUN_FIRST_PARAMETER_INDEX =  4;
+
 	/**
 	 * Runtime definition of the functions from SYSFUN_FUNCTIONS.
 	 * Populated dynamically as functions are called.
 	 */
 	private static final AliasDescriptor[] SYSFUN_AD =
 		new AliasDescriptor[SYSFUN_FUNCTIONS.length];
-	
-	/**
-	 * Dummy parameter name for functions from SYSFUN_FUNCTIONS.
-	 */
-	private static final String[] SYSFUN_PNAME = {"P1"};
-	
-	/**
-	 * Parameter mode (IN as required) for functions from SYSFUN_FUNCTIONS.
-	 */	
-	private static final int[] SYSFUN_PMODE = {JDBC30Translation.PARAMETER_MODE_IN};
 
 	// the structure that holds all the core table info
 	private TabInfoImpl[] coreInfo;
@@ -6790,30 +6788,19 @@
 					TypeDescriptor rt =
 						DataTypeDescriptor.getBuiltInDataTypeDescriptor(details[1]).getCatalogType();
 
-					// details[4] - zero or single argument type
-					String paramType = details[4];
-					TypeDescriptor[] pt;
-					String[] paramNames;
-					int[] paramModes;
-					int paramCount;
-					if (paramType != null)
-					{			
-						paramNames = DataDictionaryImpl.SYSFUN_PNAME;
-						paramCount = 1;
-						paramModes = DataDictionaryImpl.SYSFUN_PMODE;
-						pt = new TypeDescriptor[1];
-						pt[0] =
-							DataTypeDescriptor.getBuiltInDataTypeDescriptor(paramType).getCatalogType();
-					}
-					else
-					{
-						// no parameters
-						paramNames = null;
-						pt = null;
-						paramCount = 0;
-						paramModes = null;
-					}
-					
+                    // Determine the number of arguments (could be zero).
+                    int paramCount = details.length - SYSFUN_FIRST_PARAMETER_INDEX;
+					TypeDescriptor[] pt = new TypeDescriptor[paramCount];
+					String[] paramNames = new String[paramCount];
+					int[] paramModes = new int[paramCount];
+                    for (int i = 0; i < paramCount; i++) {
+                        pt[i] = DataTypeDescriptor.getBuiltInDataTypeDescriptor(
+                                    details[SYSFUN_FIRST_PARAMETER_INDEX +i]).getCatalogType();
+                        paramNames[i] = "P" + (i +1); // Dummy names
+                        // All parameters must be IN.
+                        paramModes[i] = JDBC30Translation.PARAMETER_MODE_IN;
+                    }
+
 					// details[3] = java method
 					RoutineAliasInfo ai = new RoutineAliasInfo(details[3],
 							paramCount, paramNames,

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=694166&r1=694165&r2=694166&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 Sep 11 01:00:13 2008
@@ -936,7 +936,7 @@
        a function in the SYSFUN schema.
     */
 	private static final String[] ESCAPED_SYSFUN_FUNCTIONS =
-        {"ACOS", "ASIN", "ATAN", "COS", "SIN", "TAN", "PI",
+        {"ACOS", "ASIN", "ATAN", "ATAN2", "COS", "SIN", "TAN", "PI",
          "DEGREES", "RADIANS", "EXP", "LOG", "LOG10", "CEILING", "FLOOR",
          "SIGN", "RAND", "COT" };