For a application call like CALL MYPROC(?) the logically Java method call is
(in psuedo Java/SQL code) (examples with CHAR(10) parameter)
Fixed length IN parameters - com.acme.MyProcedureMethod(?)
Variable length IN parameters - com.acme.MyProcedureMethod(CAST (? AS CHAR(10))
Fixed length INOUT parameter -
String[] holder = new String[] {?}; com.acme.MyProcedureMethod(holder); ? = holder[0]
Variable length INOUT parameter -
String[] holder = new String[] {CAST (? AS CHAR(10)}; com.acme.MyProcedureMethod(holder); ? = CAST (holder[0] AS CHAR(10))
Fixed length OUT parameter -
String[] holder = new String[1]; com.acme.MyProcedureMethod(holder); ? = holder[0]
Variable length INOUT parameter -
String[] holder = new String[1]; com.acme.MyProcedureMethod(holder); ? = CAST (holder[0] AS CHAR(10))
For static method calls there is no pre-definition of an IN or INOUT parameter, so a call to CallableStatement.registerOutParameter() makes the parameter an INOUT parameter, provided: - the parameter is passed directly to the method call (no casts or expressions). - the method's parameter type is a Java array type. Since this is a dynamic decision we compile in code to take both paths, based upon a boolean is INOUT which is derived from the ParameterValueSet. Code is logically (only single parameter String[] shown here). Note, no casts can exist here. boolean isINOUT = getParameterValueSet().getParameterMode(0) == PARAMETER_IN_OUT; if (isINOUT) { String[] holder = new String[] {?}; com.acme.MyProcedureMethod(holder); ? = holder[0] } else { com.acme.MyProcedureMethod(?) }
| Modifier and Type | Field and Description |
|---|---|
| pack-priv AliasDescriptor | |
| private boolean | |
| private int[] | |
| private boolean | isInsideBind
This flag is true while bindExpression() is executing. |
| private boolean | |
| private LocalField[] | |
| private TableName | |
| private AggregateNode | |
| private LocalField | returnsNullOnNullState
Generated boolean field to hold the indicator for if any of the parameters to a RETURNS NULL ON NULL INPUT function are NULL. |
| private String | routineDefiner
Authorization id of user owning schema in which routine is defined. |
| Access | Constructor and Description |
|---|---|
| pack-priv | StaticMethodCallNode(String
The name of the method to call methodName, String The name of the java class that the static
method belongs to. javaClassName, ContextManager The context manager cm)Constructor for a NonStaticMethodCallNode |
| pack-priv | StaticMethodCallNode(TableName
The name of the method to call methodName, String The name of the java class that the static
method belongs to. javaClassName, ContextManager The context manager cm)Constructor for a StaticMethodCallNode |
| Modifier and Type | Method and Description |
|---|---|
| pack-priv void | acceptChildren(Visitor
the visitor v)Overrides org. Accept the visitor for all visitable children of this node. |
| pack-priv JavaValueNode | Returns: this or an AggregateNodeThe FROM list for the query this
expression is in, for binding columns. fromList, SubqueryList The subquery list being built as we find SubqueryNodes subqueryList, List<AggregateNode> The aggregate list being built as we find AggregateNodes aggregates)Implements abstract org. Bind this expression. |
| private JavaValueNode | |
| pack-priv boolean | Returns: boolean Whether or not source.expression is a ColumnReference or a VirtualColumnNode.JBitSet with bit map of referenced FromTables referencedTabs, boolean Whether or not to consider method
calls, field references and conditional nodes
when building bit map simplePredsOnly)Overrides org. Categorize this predicate. |
| private void | coerceMethodParameter(FromList fromList, SubqueryList subqueryList, List<AggregateNode> aggregates, RoutineAliasInfo rai, int parameterCount, DataTypeDescriptor paramdtd, TypeId parameterTypeId, int parameterMode, int p)
Coerce an actual method parameter to the declared type of the corresponding routine argument. |
| pack-priv void | generateExpression(ExpressionClassBuilder
The ExpressionClassBuilder for the class we're generating acb, MethodBuilder The method the expression will go into mb)Implements abstract org. Do code generation for this method call |
| pack-priv void | generateOneParameter(ExpressionClassBuilder
The ExpressionClassBuilder for the class we're generating acb, MethodBuilder the method the expression will go into mb, int Identifies which parameter to generate. 0 based. parameterNumber)Overrides org. Push extra code to generate the casts within the arrays for the parameters passed as arrays. |
| private void | generatePushNestedSessionContext(ActivationClassBuilder
activation class builder acb, MethodBuilder method builder mb, boolean hadDefinersRights, String definer)Add code to set up the SQL session context for a stored procedure or function which needs a nested SQL session context (only needed for those which can contain SQL). |
| pack-priv TableName | getFullName()
Overrides org. Get the schema-qualified name of the the routine. |
| pack-priv int | |
| public AggregateNode | |
| public static ValueNode | makeCast(ValueNode parameterNode, DataTypeDescriptor targetType, ContextManager cm)
Wrap a parameter in a CAST node. |
| private void | optimizeDomainValueConversion()
If this SQL function has parameters which are SQLToJavaValueNode over JavaToSQLValueNode and the java value node underneath is a SQL function defined with CALLED ON NULL INPUT, then we can get rid of the wrapper nodes over the java value node for such parameters. |
| private boolean | |
| private void | resolveRoutine(FromList fromList, SubqueryList subqueryList, List<AggregateNode> aggregates, SchemaDescriptor sd, boolean noSchema)
Resolve a routine. |
| public void | |
| public String | Returns: This object as a StringOverrides org. Convert this object to a String. |
| ad | back to summary |
|---|---|
| pack-priv AliasDescriptor ad | |
| appearsInGroupBy | back to summary |
|---|---|
| private boolean appearsInGroupBy | |
| applicationParameterNumbers | back to summary |
|---|---|
| private int[] applicationParameterNumbers | |
| isInsideBind | back to summary |
|---|---|
| private boolean isInsideBind This flag is true while bindExpression() is executing. It is used to avoid infinite recursion when bindExpression() is reentered. | |
| isSystemCode | back to summary |
|---|---|
| private boolean isSystemCode | |
| outParamArrays | back to summary |
|---|---|
| private LocalField[] outParamArrays | |
| procedureName | back to summary |
|---|---|
| private TableName procedureName | |
| resolvedAggregate | back to summary |
|---|---|
| private AggregateNode resolvedAggregate | |
| returnsNullOnNullState | back to summary |
|---|---|
| private LocalField returnsNullOnNullState Generated boolean field to hold the indicator for if any of the parameters to a RETURNS NULL ON NULL INPUT function are NULL. Only set if this node is calling such a function. Set at generation time. | |
| routineDefiner | back to summary |
|---|---|
| private String routineDefiner Authorization id of user owning schema in which routine is defined. | |
| StaticMethodCallNode | back to summary |
|---|---|
| pack-priv StaticMethodCallNode(String methodName, String javaClassName, ContextManager cm) Constructor for a NonStaticMethodCallNode
| |
| StaticMethodCallNode | back to summary |
|---|---|
| pack-priv StaticMethodCallNode(TableName methodName, String javaClassName, ContextManager cm) Constructor for a StaticMethodCallNode
| |
| acceptChildren | back to summary |
|---|---|
| pack-priv void acceptChildren(Visitor v) throws StandardException Overrides org. Doc from org. Accept the visitor for all visitable children of this node.
| |
| bindExpression | back to summary |
|---|---|
| pack-priv JavaValueNode bindExpression(FromList fromList, SubqueryList subqueryList, List<AggregateNode> aggregates) throws StandardException Implements abstract org. Bind this expression. This means binding the sub-expressions, as well as figuring out what the return type is for this expression.
| |
| bindExpressionMinion | back to summary |
|---|---|
| private JavaValueNode bindExpressionMinion(FromList fromList, SubqueryList subqueryList, List<AggregateNode> aggregates) throws StandardException | |
| categorize | back to summary |
|---|---|
| pack-priv boolean categorize(JBitSet referencedTabs, boolean simplePredsOnly) throws StandardException Overrides org. Categorize this predicate. Initially, this means building a bit map of the referenced tables for each predicate. If the source of this ColumnReference (at the next underlying level) is not a ColumnReference or a VirtualColumnNode then this predicate will not be pushed down. For example, in: select * from (select 1 from s) a (x) where x = 1 we will not push down x = 1. Note It would be easy to handle the case of a constant, but if the inner SELECT returns an arbitrary expression, then we would have to copy that tree into the pushed predicate, and that tree could contain subqueries and method calls. RESOLVE - revisit this issue once we have views.
| |
| coerceMethodParameter | back to summary |
|---|---|
| private void coerceMethodParameter(FromList fromList, SubqueryList subqueryList, List<AggregateNode> aggregates, RoutineAliasInfo rai, int parameterCount, DataTypeDescriptor paramdtd, TypeId parameterTypeId, int parameterMode, int p) throws StandardException Coerce an actual method parameter to the declared type of the corresponding routine argument. | |
| generateExpression | back to summary |
|---|---|
| pack-priv void generateExpression(ExpressionClassBuilder acb, MethodBuilder mb) throws StandardException Implements abstract org. Do code generation for this method call
| |
| generateOneParameter | back to summary |
|---|---|
| pack-priv void generateOneParameter(ExpressionClassBuilder acb, MethodBuilder mb, int parameterNumber) throws StandardException Overrides org. Push extra code to generate the casts within the arrays for the parameters passed as arrays.
| |
| generatePushNestedSessionContext | back to summary |
|---|---|
| private void generatePushNestedSessionContext(ActivationClassBuilder acb, MethodBuilder mb, boolean hadDefinersRights, String definer) throws StandardException Add code to set up the SQL session context for a stored procedure or function which needs a nested SQL session context (only needed for those which can contain SQL). The generated code calls pushNestedSessionContext.
| |
| getFullName | back to summary |
|---|---|
| pack-priv TableName getFullName() Overrides org. Doc from org. Get the schema-qualified name of the the routine. Is non-null only for StaticMethodCallNodes.
| |
| getPrivType | back to summary |
|---|---|
| pack-priv int getPrivType() Set default privilege of EXECUTE for this node. | |
| getResolvedAggregate | back to summary |
|---|---|
| public AggregateNode getResolvedAggregate() Get the aggregate, if any, which this method call resolves to. | |
| makeCast | back to summary |
|---|---|
| public static ValueNode makeCast(ValueNode parameterNode, DataTypeDescriptor targetType, ContextManager cm) throws StandardException Wrap a parameter in a CAST node. | |
| optimizeDomainValueConversion | back to summary |
|---|---|
| private void optimizeDomainValueConversion() throws StandardException If this SQL function has parameters which are SQLToJavaValueNode over JavaToSQLValueNode and the java value node underneath is a SQL function defined with CALLED ON NULL INPUT, then we can get rid of the wrapper nodes over the java value node for such parameters. This is because SQL functions defined with CALLED ON NULL INPUT need access to only java domain values. This can't be done for parameters which are wrappers over SQL function defined with RETURN NULL ON NULL INPUT because such functions need access to both sql domain value and java domain value. - Derby479 This optimization is not available if the outer function is RETURN NULL ON NULL INPUT. That is because the SQLToJavaNode is responsible for compiling the byte code which skips the method call if the parameter is null--if we remove the SQLToJavaNode, then we don't compile that check and we get bug DERBY-1030. | |
| permitsSQL | back to summary |
|---|---|
| private boolean permitsSQL(RoutineAliasInfo rai) Returns true if the routine permits SQL. | |
| resolveRoutine | back to summary |
|---|---|
| private void resolveRoutine(FromList fromList, SubqueryList subqueryList, List<AggregateNode> aggregates, SchemaDescriptor sd, boolean noSchema) throws StandardException Resolve a routine. Obtain a list of routines from the data dictionary of the correct type (functions or procedures) and name. Pick the best routine from the list. Currently only a single routine with a given type and name is allowed, thus if changes are made to support overloaded routines, careful code inspection and testing will be required. | |
| setAppearsInGroupBy | back to summary |
|---|---|
| public void setAppearsInGroupBy() Flag that this function invocation appears in a GROUP BY clause | |
| toString | back to summary |
|---|---|
| public String toString() Overrides org. Convert this object to a String. See comments in QueryTreeNode.java for how this should be done for tree printing. | |