[ http://issues.apache.org/jira/browse/DERBY-582?page=all ]

Mamta A. Satoor updated DERBY-582:
----------------------------------

    Attachment: Derby582UnaryMinusDynamic104005.txt

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/trigge
 rs. 

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.



> Dynamic parameter should be allowed to be the operand of unary operator "-". 
> Derby throws exception 42X36: The '-' operator is not allowed to take a ? 
> parameter as an operand."
> --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>          Key: DERBY-582
>          URL: http://issues.apache.org/jira/browse/DERBY-582
>      Project: Derby
>         Type: Bug
>   Components: JDBC
>     Versions: 10.2.0.0
>     Reporter: Mamta A. Satoor
>     Assignee: Mamta A. Satoor
>  Attachments: Derby582UnaryDynamic092605.txt, 
> Derby582UnaryMinusDynamic104005.txt
>
> A simple test program which uses dynamic parameter for unary operator "-" 
> fails with an exception. Following is the snippet of the code
>       ps = con.prepareStatement("select * from t1 where c11 = -?");
>       ps.setInt(1,1);
>       rs = ps.executeQuery();
> The prepareStatement call fails with following exception
> SQLSTATE(42X36):ERROR 42X36: The '-' operator is not allowed to take a ? 
> parameter as an operand.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to