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 bp...@apache.org on 2006/10/14 19:00:55 UTC
svn commit: r463982 - in /db/derby/code/trunk/java:
engine/org/apache/derby/catalog/types/
engine/org/apache/derby/impl/sql/compile/
testing/org/apache/derbyTesting/functionTests/master/
testing/org/apache/derbyTesting/functionTests/master/DerbyNet/ te...
Author: bpendleton
Date: Sat Oct 14 10:00:54 2006
New Revision: 463982
URL: http://svn.apache.org/viewvc?view=rev&rev=463982
Log:
DERBY-183: Allow unnamed parameters in CREATE FUNCTION
This patch was contributed by James F. Adams (derby@xemaps.com)
The patch does the following:
1) Modifies java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj
a) Initializes parameterName to "" in procedureParameterDefinition
and functionParameterDefinition
b) Makes parameterName optional in procedureParameterDefinition
and functionParameterDefinition
2) Modifies java/engine/org/apache/derby/impl/sql/compile/CreateAliasNode.java
to ignore function and procedure parameter names equal to "" when
checking for duplicate parameter names.
Tests have been added to lang/functions.sql and lang/procedure.java.
The parameter name is made optional by surrounding its production with [].
This changes the grammar from:
parameterName = identifier(Limits.MAX_IDENTIFIER_LENGTH, true)
typeDescriptor = dataTypeDDL()
to:
[ parameterName = identifier(Limits.MAX_IDENTIFIER_LENGTH, true) ]
typeDescriptor = dataTypeDDL()
This results in a choice conflict because certain tokens satisfy both
identifier() and dataTypeDDL(). An additional token of lookahead resolves
this conflict. This results in:
[ LOOKAHEAD(2) parameterName = identifier(Limits.MAX_IDENTIFIER_LENGTH, true) ]
typeDescriptor = dataTypeDDL()
Expressing this in an alternate form such as:
(
parameterName = identifier(Limits.MAX_IDENTIFIER_LENGTH, true)
typeDescriptor = dataTypeDDL()
) | typeDescriptor = dataTypeDDL()
still results in a choice conflict so I opted for the more compact form.
Modified:
db/derby/code/trunk/java/engine/org/apache/derby/catalog/types/RoutineAliasInfo.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/sqlgrammar.jj
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/jdk16/procedure.out
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/procedure.out
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/procedure.out
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk16/procedure.out
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/procedure.out
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/functions.out
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/procedure.out
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/functions.sql
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/procedure.java
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/ProcedureTest.java
Modified: db/derby/code/trunk/java/engine/org/apache/derby/catalog/types/RoutineAliasInfo.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/catalog/types/RoutineAliasInfo.java?view=diff&rev=463982&r1=463981&r2=463982
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/catalog/types/RoutineAliasInfo.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/catalog/types/RoutineAliasInfo.java Sat Oct 14 10:00:54 2006
@@ -34,7 +34,7 @@
import org.apache.derby.iapi.services.sanity.SanityManager;
/**
- * Describe a r (procedure or function) alias.
+ * Describe a routine (procedure or function) alias.
*
* @see AliasInfo
*/
@@ -55,6 +55,11 @@
private int parameterCount;
private TypeDescriptor[] parameterTypes;
+ /**
+ * Name of each parameter. As of DERBY 10.3, parameter names
+ * are optional. If the parameter is unnamed, parameterNames[i]
+ * is a string of length 0
+ */
private String[] parameterNames;
/**
IN, OUT, INOUT
@@ -171,6 +176,12 @@
public int[] getParameterModes() {
return parameterModes;
}
+ /**
+ * Returns an array containing the names of the parameters.
+ * As of DERBY 10.3, parameter names are optional (see DERBY-183
+ * for more information). If the i-th parameter was unnamed,
+ * parameterNames[i] will contain a string of length 0.
+ */
public String[] getParameterNames() {
return parameterNames;
}
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?view=diff&rev=463982&r1=463981&r2=463982
==============================================================================
--- 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 Sat Oct 14 10:00:54 2006
@@ -168,7 +168,7 @@
System.arraycopy(names, 0, dupNameCheck, 0, paramCount);
java.util.Arrays.sort(dupNameCheck);
for (int dnc = 1; dnc < dupNameCheck.length; dnc++) {
- if (dupNameCheck[dnc].equals(dupNameCheck[dnc - 1]))
+ if (! dupNameCheck[dnc].equals("") && dupNameCheck[dnc].equals(dupNameCheck[dnc - 1]))
throw StandardException.newException(SQLState.LANG_DB2_DUPLICATE_NAMES, dupNameCheck[dnc], getFullName());
}
}
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?view=diff&rev=463982&r1=463981&r2=463982
==============================================================================
--- 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 Sat Oct 14 10:00:54 2006
@@ -9833,12 +9833,15 @@
procedureParameterDefinition(Vector[] list) throws StandardException :
{
DataTypeDescriptor typeDescriptor;
- String parameterName;
+ String parameterName = "";
Integer inout;
}
{
inout = inoutParameter()
- parameterName = identifier(Limits.MAX_IDENTIFIER_LENGTH, true)
+ // Two tokens of LOOKAHEAD are necessary because certain tokens can be both
+ // an identifier() and a dataTypeDDL(). The extra token of lookahead resolves
+ // this choice conflict.
+ [ LOOKAHEAD(2) parameterName = identifier(Limits.MAX_IDENTIFIER_LENGTH, true) ]
typeDescriptor = dataTypeDDL()
{
list[0].addElement(parameterName);
@@ -9925,11 +9928,14 @@
functionParameterDefinition(Vector[] list) throws StandardException :
{
DataTypeDescriptor typeDescriptor;
- String parameterName;
+ String parameterName = "";
Integer inout;
}
{
- parameterName = identifier(Limits.MAX_IDENTIFIER_LENGTH, true)
+ // Two tokens of LOOKAHEAD are necessary because certain tokens can be both
+ // an identifier() and a dataTypeDDL(). The extra token of lookahead resolves
+ // this choice conflict.
+ [ LOOKAHEAD(2) parameterName = identifier(Limits.MAX_IDENTIFIER_LENGTH, true) ]
typeDescriptor = dataTypeDDL()
{
list[0].addElement(parameterName);
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/jdk16/procedure.out
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/jdk16/procedure.out?view=diff&rev=463982&r1=463981&r2=463982
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/jdk16/procedure.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/jdk16/procedure.out Sat Oct 14 10:00:54 2006
@@ -935,6 +935,7 @@
CALL LITT.TY_DECIMAL ('12.34', ?) (42821) Columns of type 'DECIMAL' cannot hold values of type 'CHAR'.
CALL LITT.TY_CHAR ('12.34', ?)=>12.34 <
CALL LITT.TY_VARCHAR ('12.34', ?)=>12.34<
+testNoParameterNames
JIRA-491 Successful.
JIRA-492 successful -- no hang!
testImplicitClose(): PASSED
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/procedure.out
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/procedure.out?view=diff&rev=463982&r1=463981&r2=463982
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/procedure.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/procedure.out Sat Oct 14 10:00:54 2006
@@ -935,6 +935,7 @@
CALL LITT.TY_DECIMAL ('12.34', ?) (42821) Columns of type 'DECIMAL' cannot hold values of type 'CHAR'.
CALL LITT.TY_CHAR ('12.34', ?)=>12.34 <
CALL LITT.TY_VARCHAR ('12.34', ?)=>12.34<
+testNoParameterNames
JIRA-491 Successful.
JIRA-492 successful -- no hang!
testImplicitClose(): PASSED
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/procedure.out
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/procedure.out?view=diff&rev=463982&r1=463981&r2=463982
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/procedure.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/procedure.out Sat Oct 14 10:00:54 2006
@@ -935,6 +935,7 @@
CALL LITT.TY_DECIMAL ('12.34', ?) (42821) Columns of type 'DECIMAL' cannot hold values of type 'CHAR'.
CALL LITT.TY_CHAR ('12.34', ?)=>12.34 <
CALL LITT.TY_VARCHAR ('12.34', ?)=>12.34<
+testNoParameterNames
MultipleRSAutoCommit: PASS.
MultipleRSNoCommit: PASS.
JIRA-491 Successful.
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk16/procedure.out
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk16/procedure.out?view=diff&rev=463982&r1=463981&r2=463982
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk16/procedure.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk16/procedure.out Sat Oct 14 10:00:54 2006
@@ -935,6 +935,7 @@
CALL LITT.TY_DECIMAL ('12.34', ?) (42821) Columns of type 'DECIMAL' cannot hold values of type 'CHAR'.
CALL LITT.TY_CHAR ('12.34', ?)=>12.34 <
CALL LITT.TY_VARCHAR ('12.34', ?)=>12.34<
+testNoParameterNames
MultipleRSAutoCommit: PASS.
MultipleRSNoCommit: PASS.
JIRA-491 Successful.
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/procedure.out
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/procedure.out?view=diff&rev=463982&r1=463981&r2=463982
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/procedure.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/procedure.out Sat Oct 14 10:00:54 2006
@@ -935,6 +935,7 @@
CALL LITT.TY_DECIMAL ('12.34', ?) (42821) Columns of type 'DECIMAL' cannot hold values of type 'CHAR'.
CALL LITT.TY_CHAR ('12.34', ?)=>12.34 <
CALL LITT.TY_VARCHAR ('12.34', ?)=>12.34<
+testNoParameterNames
MultipleRSAutoCommit: PASS.
MultipleRSNoCommit: PASS.
JIRA-491 Successful.
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/functions.out
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/functions.out?view=diff&rev=463982&r1=463981&r2=463982
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/functions.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/functions.out Sat Oct 14 10:00:54 2006
@@ -482,6 +482,23 @@
0 rows inserted/updated/deleted
ij> DROP TABLE SV_TAB;
0 rows inserted/updated/deleted
+ij> -- function definition without parameter names are valid
+CREATE FUNCTION NONAME1(INT, INT) RETURNS INT EXTERNAL NAME 'java.lang.Math.max' LANGUAGE JAVA PARAMETER STYLE JAVA;
+0 rows inserted/updated/deleted
+ij> CREATE FUNCTION NONAME2(P1 INT, INT) RETURNS INT EXTERNAL NAME 'java.lang.Math.max' LANGUAGE JAVA PARAMETER STYLE JAVA;
+0 rows inserted/updated/deleted
+ij> VALUES NONAME1(99, -45);
+1
+-----------
+99
+ij> VALUES NONAME2(99, -45);
+1
+-----------
+99
+ij> DROP FUNCTION NONAME1;
+0 rows inserted/updated/deleted
+ij> DROP FUNCTION NONAME2;
+0 rows inserted/updated/deleted
ij> -- check MODIFIES SQL DATA not allowed with FUNCTION
CREATE FUNCTION COUNT_ROWS(P1 VARCHAR(128), P2 VARCHAR(128)) RETURNS INT
MODIFIES SQL DATA
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/procedure.out
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/procedure.out?view=diff&rev=463982&r1=463981&r2=463982
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/procedure.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/procedure.out Sat Oct 14 10:00:54 2006
@@ -1011,6 +1011,9 @@
CALL LITT.TY_DECIMAL ('12.34', ?) (42821) Columns of type 'DECIMAL' cannot hold values of type 'CHAR'.
CALL LITT.TY_CHAR ('12.34', ?)=>12.34 <
CALL LITT.TY_VARCHAR ('12.34', ?)=>12.34<
+testNoParameterNames
+noname(int,String) called
+noname(int,String) called
MultipleRSAutoCommit: PASS.
MultipleRSNoCommit: PASS.
JIRA-491 Successful.
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/functions.sql
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/functions.sql?view=diff&rev=463982&r1=463981&r2=463982
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/functions.sql (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/functions.sql Sat Oct 14 10:00:54 2006
@@ -193,6 +193,16 @@
DROP TABLE SV_TAB;
+-- function definition without parameter names are valid
+CREATE FUNCTION NONAME1(INT, INT) RETURNS INT EXTERNAL NAME 'java.lang.Math.max' LANGUAGE JAVA PARAMETER STYLE JAVA;
+CREATE FUNCTION NONAME2(P1 INT, INT) RETURNS INT EXTERNAL NAME 'java.lang.Math.max' LANGUAGE JAVA PARAMETER STYLE JAVA;
+
+VALUES NONAME1(99, -45);
+VALUES NONAME2(99, -45);
+
+DROP FUNCTION NONAME1;
+DROP FUNCTION NONAME2;
+
-- check MODIFIES SQL DATA not allowed with FUNCTION
CREATE FUNCTION COUNT_ROWS(P1 VARCHAR(128), P2 VARCHAR(128)) RETURNS INT
MODIFIES SQL DATA
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/procedure.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/procedure.java?view=diff&rev=463982&r1=463981&r2=463982
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/procedure.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/procedure.java Sat Oct 14 10:00:54 2006
@@ -87,6 +87,8 @@
testSQLControl(conn);
testLiterals(conn);
+ testNoParameterNames(conn);
+
multipleRSTests(conn);
jira_491_492(conn);
testImplicitClose(conn);
@@ -98,6 +100,18 @@
}
+ public static void testNoParameterNames(Connection conn) throws SQLException {
+ System.out.println("testNoParameterNames");
+
+ Statement s = conn.createStatement();
+ s.execute("CREATE PROCEDURE NONAME(IN INT, IN VARCHAR(10)) LANGUAGE JAVA PARAMETER STYLE JAVA EXTERNAL NAME 'org.apache.derbyTesting.functionTests.util.ProcedureTest.noname'");
+ s.execute("{call noname(1, 'foo')}");
+ s.execute("DROP PROCEDURE NONAME");
+ s.execute("CREATE PROCEDURE NONAME(IN INT, IN P2 VARCHAR(10)) LANGUAGE JAVA PARAMETER STYLE JAVA EXTERNAL NAME 'org.apache.derbyTesting.functionTests.util.ProcedureTest.noname'");
+ s.execute("{call noname(1, 'foo')}");
+ s.execute("DROP PROCEDURE NONAME");
+ }
+
public static void testNegative(Connection conn) throws SQLException {
System.out.println("testNegative");
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/ProcedureTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/ProcedureTest.java?view=diff&rev=463982&r1=463981&r2=463982
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/ProcedureTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/ProcedureTest.java Sat Oct 14 10:00:54 2006
@@ -777,5 +777,9 @@
ps.close();
conn.close();
}
+
+ public static void noname(int p1, String p2) {
+ System.out.println("noname(int,String) called");
+ }
}