db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Nirmal Fernando <nirmal070...@gmail.com>
Subject Re: Checking an Expressions
Date Mon, 19 Apr 2010 03:11:50 GMT
Thanks Bryan for the very clear explanation, I think this will be very
useful to me.


On Sun, Apr 18, 2010 at 8:35 PM, Bryan Pendleton
<bpendleton.derby@gmail.com> wrote:
> Nirmal Fernando wrote:
>>
>> How can we check whether a particular ValueNode is an "expression" (eg:
>> i*2) ?.
>>
>> *Note: We can check "ValueNode instance of ColumnReference" to check
>> whether it is a column (eg: i).
>
> I think that every ValueNode is an expression of some sort. Consider:
>
>   select name from employee;
>   select year_hired - 1900 from employee;
>   select max(salary) from employee;
>   select current_date from employee;
>   select first_name || ' ' || last_name from employee;
>
> All of these will result in various ValueNode instances being constructed.
> Some are
> simple ColumnReference nodes. Others are more complex expressions.
>
> Unfortunately (or fortunately, depending on how you look at it), ValueNode
> is
> an extremely general-purpose class in Derby, and there are a large number
> of particular sub-classes of ValueNode that are of interest.
>
> It so happens that the case of "a simple direct reference to a column in
> this table"
> is extremely common, and has a number of optimizations that we perform, and
> so
> you see code in Derby that says
>
>   if (expression instanceof ColumnReference)
>
> quite commonly. However, there are many sub-classes of ValueNode. Consider
> that these classes are just some of the *direct* sub-classes of ValueNode:
>
> BaseColumnNode.java:public class BaseColumnNode extends ValueNode
> BinaryListOperatorNode.java:public abstract class BinaryListOperatorNode
> extends ValueNode
> BinaryOperatorNode.java:public class BinaryOperatorNode extends ValueNode
> CastNode.java:public class CastNode extends ValueNode
> CoalesceFunctionNode.java:public class CoalesceFunctionNode extends
> ValueNode
> ColumnReference.java:public class ColumnReference extends ValueNode
> ConditionalNode.java:public class ConditionalNode extends ValueNode
> ConstantNode.java:abstract class ConstantNode extends ValueNode
> CurrentDatetimeOperatorNode.java:public class CurrentDatetimeOperatorNode
> extends ValueNode {
> CurrentRowLocationNode.java:public class CurrentRowLocationNode extends
> ValueNode
> DefaultNode.java:public  class DefaultNode extends ValueNode
> GenerationClauseNode.java:public class GenerationClauseNode extends
> ValueNode
> JavaToSQLValueNode.java:public class JavaToSQLValueNode extends ValueNode
> NextSequenceNode.java:public class NextSequenceNode extends ValueNode {
> ParameterNode.java:public class ParameterNode extends ValueNode
> ResultColumn.java:public class ResultColumn extends ValueNode
> SpecialFunctionNode.java:public class SpecialFunctionNode extends ValueNode
> SubqueryNode.java:public class SubqueryNode extends ValueNode
> TernaryOperatorNode.java:public class TernaryOperatorNode extends ValueNode
> UnaryOperatorNode.java:public class UnaryOperatorNode extends ValueNode
> VirtualColumnNode.java:public class VirtualColumnNode extends ValueNode
>
> And many of these classes have further sub-classes of them.
>
> You might finding it helpful to use the parse-tree-printing support in Derby
> to dump
> out the parse tree from several sample queries and have a look at how the
> parse
> trees are put together.
>
> I think that you can use the ASTVisitor support that was added in DERBY-4415
> (https://issues.apache.org/jira/browse/DERBY-4415) and DERBY-791
> (https://issues.apache.org/jira/browse/DERBY-791) to view the parse trees.
>
> thanks,
>
> bryan
>
>



-- 
Best Regards,
Nirmal

C.S.Nirmal J. Fernando
Department of Computer Science & Engineering,
Faculty of Engineering,
University of Moratuwa,
Sri Lanka.

Mime
View raw message