01: /*
02:
03: Derby - Class org.apache.derby.impl.sql.compile.QuantifiedUnaryOperatorNode
04:
05: Licensed to the Apache Software Foundation (ASF) under one or more
06: contributor license agreements. See the NOTICE file distributed with
07: this work for additional information regarding copyright ownership.
08: The ASF licenses this file to you under the Apache License, Version 2.0
09: (the "License"); you may not use this file except in compliance with
10: the License. You may obtain a copy of the License at
11:
12: http://www.apache.org/licenses/LICENSE-2.0
13:
14: Unless required by applicable law or agreed to in writing, software
15: distributed under the License is distributed on an "AS IS" BASIS,
16: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17: See the License for the specific language governing permissions and
18: limitations under the License.
19:
20: */
21:
22: package org.apache.derby.impl.sql.compile;
23:
24: import org.apache.derby.iapi.sql.dictionary.DataDictionary;
25:
26: import org.apache.derby.iapi.error.StandardException;
27:
28: import org.apache.derby.iapi.services.sanity.SanityManager;
29:
30: import org.apache.derby.iapi.util.JBitSet;
31:
32: import java.util.Vector;
33:
34: /**
35: * A QuantifiedUnaryOperatorNode represents a unary quantified predicate
36: * that is used with a subquery, such as EXISTS and NOT EXISTS. Quantified
37: * predicates all return Boolean values. All quantified operators will be
38: * removed from the tree by the time we get to code generation - they will
39: * be replaced by other constructs that can be compiled. For example,
40: * an EXISTS node may be converted to a type of join.
41: *
42: * @author Jeff Lichtman
43: */
44:
45: public class QuantifiedUnaryOperatorNode extends UnaryOperatorNode {
46: /*
47: ** For NOT EXISTS (SELECT * ...), the parser will generate a NOT
48: ** node and an EXISTS node. Later, normalization will change this
49: ** to a NOT_EXISTS node.
50: */
51: public final static int EXISTS = 1;
52: public final static int NOT_EXISTS = 2;
53:
54: SubqueryNode operand;
55:
56: /**
57: * Prints the sub-nodes of this object. See QueryTreeNode.java for
58: * how tree printing is supposed to work.
59: *
60: * @param depth The depth of this node in the tree
61: */
62:
63: public void printSubNodes(int depth) {
64: if (SanityManager.DEBUG) {
65: super .printSubNodes(depth);
66: if (operand != null) {
67: printLabel(depth, "operand: ");
68: operand.treePrint(depth + 1);
69: }
70: }
71: }
72:
73: /**
74: * Bind this expression. This means binding the sub-expressions,
75: * as well as figuring out what the return type is for this expression.
76: *
77: * @param fromList The FROM list for the query this
78: * expression is in, for binding columns.
79: * @param subqueryList The subquery list being built as we find SubqueryNodes
80: * @param aggregateVector The aggregate vector being built as we find AggregateNodes
81: *
82: * @return The new top of the expression tree.
83: *
84: * @exception StandardException Thrown on error
85: */
86:
87: public ValueNode bindExpression(FromList fromList,
88: SubqueryList subqueryList, Vector aggregateVector)
89: throws StandardException {
90: operand.bind();
91:
92: /* RESOLVE: Need to bind this node */
93: /* RESOLVE: Need to set the subqueryOperator in the SubqueryNode */
94:
95: return this;
96: }
97: }
|