This patch tries to support the type setting of unary-/unary+ parameter similar to what is done for ? parameter ie the type of the -?/+? will be dependent on the context in which it is used. And hence the type setting rules for -?/+? will be same as for a regular ? parameter.

In order to achieve this, I have changed UnaryOperatorNode to extend ParameterNode. In addition, it has the method isParameterNode which will return true only if its operand is an instance of ParameterNode and it's method isParameterNode returns true AND the unary operator is of the type unary-/unary+. What this means is that just because a class is instance of ParameterNode doesn't automatically mean it indeed is a ParameterNode. An additional check of the isParameterNode is required to make sure there is a parameter underneath. This change in rule has required adding a new class called HasParameterNodeVisitor which gets used by the sqlgrammar to make sure there are no parameters allowed in views and triggers. HasParameterNodeVisitor checks if the node is of the type ParameterNode AND checks if the isParameterNode returns true. If yes, then the HasParameterNodeVisitor's visit method will return that node and grammar will throw an exception for parameter usage in views/triggers.

One additional change is to not do any binding of -?/+? if the type of the parameter is not yet determined. When the type does get set using setDescriptor method, it will call the binding code on the -?/+?. An example here will make things clearer select * from t1 where c1 = -?
During the bind phase of compilation, BinaryOperatorNode's bindExpression method gets called. This method first calls bindExpression on c1 and then it calls bindExpression on -?. But at this point, we don't know the type of -? and hence the bindExpression of UnaryOperatorNode simply returns w/o trying to do any binding. After the binding calls on the 2 operands,
bindExpression in BinaryOperatorNode checks if the right operand is a parameter and if so, it calls setDescriptor method on it to set it's type to the type of the left operand. This is when the actual binding of -? will happen and this is accomplished by overwriting the setDescriptor method in the UnaryArithmeticOperatorNode. This method after setting the type of -? calls the binding code on it which among other checks will make sure that the type is getting set to a numeric type.

I hope this explanation, the comments in the code and the new test makes it easier to understand the patch.

svn stat
M      java\engine\org\apache\derby\impl\sql\compile\ParameterNode.java
M      java\engine\org\apache\derby\impl\sql\compile\UnaryDateTimestampOperatorNode.java
M      java\engine\org\apache\derby\impl\sql\compile\UnaryArithmeticOperatorNode.java
M      java\engine\org\apache\derby\impl\sql\compile\CollectNodesVisitor.java
M      java\engine\org\apache\derby\impl\sql\compile\HasNodeVisitor.java
M      java\engine\org\apache\derby\impl\sql\compile\sqlgrammar.jj
A      java\engine\org\apache\derby\impl\sql\compile\HasParameterNodeVisitor.java
M      java\engine\org\apache\derby\impl\sql\compile\UnaryOperatorNode.java
M      java\engine\org\apache\derby\impl\sql\compile\ValueNode.java
M      java\testing\org\apache\derbyTesting\functionTests\tests\lang\build.xml
A      java\testing\org\apache\derbyTesting\functionTests\tests\lang\unaryArithmeticDynamicParameter.java
A      java\testing\org\apache\derbyTesting\functionTests\master\unaryArithmeticDynamicParameter.out
M      java\testing\org\apache\derbyTesting\functionTests\suites\derbylang.runall
M      java\testing\org\apache\derbyTesting\functionTests\suites\derbynetmats.runall

I have run all the tests and no new failures. I have added a new test which is part of this patch. The patch is attached to the JIRA entry. Any comments, feedback would be great.

thanks,
Mamta