001: /*
002:
003: Derby - Class org.apache.derby.impl.sql.compile.CurrentDatetimeOperatorNode
004:
005: Licensed to the Apache Software Foundation (ASF) under one or more
006: contributor license agreements. See the NOTICE file distributed with
007: this work for additional information regarding copyright ownership.
008: The ASF licenses this file to you under the Apache License, Version 2.0
009: (the "License"); you may not use this file except in compliance with
010: the License. You may obtain a copy of the License at
011:
012: http://www.apache.org/licenses/LICENSE-2.0
013:
014: Unless required by applicable law or agreed to in writing, software
015: distributed under the License is distributed on an "AS IS" BASIS,
016: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017: See the License for the specific language governing permissions and
018: limitations under the License.
019:
020: */
021:
022: package org.apache.derby.impl.sql.compile;
023:
024: import org.apache.derby.iapi.sql.dictionary.DataDictionary;
025:
026: import org.apache.derby.iapi.sql.compile.CompilerContext;
027:
028: import org.apache.derby.iapi.types.TypeId;
029: import org.apache.derby.iapi.types.DataTypeDescriptor;
030:
031: import org.apache.derby.iapi.services.compiler.MethodBuilder;
032: import org.apache.derby.iapi.services.compiler.LocalField;
033: import org.apache.derby.iapi.services.sanity.SanityManager;
034:
035: import org.apache.derby.iapi.store.access.Qualifier;
036:
037: import org.apache.derby.impl.sql.compile.ExpressionClassBuilder;
038:
039: import java.lang.reflect.Modifier;
040:
041: import org.apache.derby.iapi.error.StandardException;
042:
043: import java.sql.Types;
044:
045: import java.util.Vector;
046:
047: /**
048: * The CurrentDatetimeOperator operator is for the builtin CURRENT_DATE,
049: * CURRENT_TIME, and CURRENT_TIMESTAMP operations.
050: *
051: * @author ames
052: */
053: public class CurrentDatetimeOperatorNode extends ValueNode {
054:
055: public static final int CURRENT_DATE = 0;
056: public static final int CURRENT_TIME = 1;
057: public static final int CURRENT_TIMESTAMP = 2;
058:
059: static private final int jdbcTypeId[] = { Types.DATE, Types.TIME,
060: Types.TIMESTAMP };
061: static private final String methodName[] = { // used in toString only
062: "CURRENT DATE", "CURRENT TIME", "CURRENT TIMSTAMP" };
063:
064: private int whichType;
065:
066: public void init(Object whichType) {
067: this .whichType = ((Integer) whichType).intValue();
068:
069: if (SanityManager.DEBUG)
070: SanityManager.ASSERT(this .whichType >= 0
071: && this .whichType <= 2);
072: }
073:
074: //
075: // QueryTreeNode interface
076: //
077:
078: /**
079: * Binding this expression means setting the result DataTypeServices.
080: * In this case, the result type is based on the operation requested.
081: *
082: * @param fromList The FROM list for the statement. This parameter
083: * is not used in this case.
084: * @param subqueryList The subquery list being built as we find
085: * SubqueryNodes. Not used in this case.
086: * @param aggregateVector The aggregate vector being built as we find
087: * AggregateNodes. Not used in this case.
088: *
089: * @return The new top of the expression tree.
090: *
091: * @exception StandardException Thrown on error
092: */
093: public ValueNode bindExpression(FromList fromList,
094: SubqueryList subqueryList, Vector aggregateVector)
095: throws StandardException {
096: checkReliability(methodName[whichType],
097: CompilerContext.DATETIME_ILLEGAL);
098:
099: setType(DataTypeDescriptor.getBuiltInDataTypeDescriptor(
100: jdbcTypeId[whichType], false /* Not nullable */
101: ));
102: return this ;
103: }
104:
105: /**
106: * Return the variant type for the underlying expression.
107: * The variant type can be:
108: * VARIANT - variant within a scan
109: * (method calls and non-static field access)
110: * SCAN_INVARIANT - invariant within a scan
111: * (column references from outer tables)
112: * QUERY_INVARIANT - invariant within the life of a query
113: * (constant expressions)
114: *
115: * @return The variant type for the underlying expression.
116: */
117: protected int getOrderableVariantType() {
118: // CurrentDate, Time, Timestamp are invariant for the life of the query
119: return Qualifier.QUERY_INVARIANT;
120: }
121:
122: /**
123: * CurrentDatetimeOperatorNode is used in expressions.
124: * The expression generated for it invokes a static method
125: * on a special Cloudscape type to get the system time and
126: * wrap it in the right java.sql type, and then wrap it
127: * into the right shape for an arbitrary value, i.e. a column
128: * holder. This is very similar to what constants do.
129: *
130: * @param acb The ExpressionClassBuilder for the class being built
131: * @param mb The method the code to place the code
132: *
133: * @exception StandardException Thrown on error
134: */
135: public void generateExpression(ExpressionClassBuilder acb,
136: MethodBuilder mb) throws StandardException {
137: acb.pushDataValueFactory(mb);
138:
139: /*
140: ** First, we generate the current expression to be stuffed into
141: ** the right shape of holder.
142: */
143: switch (whichType) {
144: case CURRENT_DATE:
145: acb.getCurrentDateExpression(mb);
146: break;
147: case CURRENT_TIME:
148: acb.getCurrentTimeExpression(mb);
149: break;
150: case CURRENT_TIMESTAMP:
151: acb.getCurrentTimestampExpression(mb);
152: break;
153: }
154:
155: String fieldType = getTypeCompiler().interfaceName();
156: LocalField field = acb.newFieldDeclaration(Modifier.PRIVATE,
157: fieldType);
158: getTypeCompiler().generateDataValue(mb, field);
159: }
160:
161: /*
162: print the non-node subfields
163: */
164: public String toString() {
165: if (SanityManager.DEBUG) {
166: return super .toString() + "method = "
167: + methodName[whichType] + "\n";
168: } else {
169: return "";
170: }
171: }
172:
173: /**
174: * {@inheritDoc}
175: */
176: protected boolean isEquivalent(ValueNode o) {
177: if (isSameNodeType(o)) {
178: CurrentDatetimeOperatorNode other = (CurrentDatetimeOperatorNode) o;
179: return other.whichType == whichType;
180: }
181: return false;
182: }
183: }
|