db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Mamta Satoor <msat...@gmail.com>
Subject [PATCH]Derby-582 Dynamic parameter should be allowed to be the operand of unary operator "-".
Date Wed, 05 Oct 2005 04:20:06 GMT
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\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
M java\testing\org\apache\derbyTesting\functionTests\suites\derbylang.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.


View raw message