001: /*
002:
003: Derby - Class org.apache.derby.impl.sql.compile.TimestampOperatorNode
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.types.TypeId;
025: import org.apache.derby.iapi.types.DataValueFactory;
026: import org.apache.derby.iapi.types.DataTypeDescriptor;
027: import org.apache.derby.iapi.services.compiler.MethodBuilder;
028: import org.apache.derby.iapi.error.StandardException;
029:
030: import org.apache.derby.impl.sql.compile.ExpressionClassBuilder;
031:
032: import org.apache.derby.iapi.reference.ClassName;
033: import org.apache.derby.iapi.reference.SQLState;
034:
035: import org.apache.derby.iapi.services.classfile.VMOpcode;
036:
037: import java.sql.Types;
038:
039: import java.util.Vector;
040:
041: /**
042: * The TimestampOperatorNode class implements the timestamp( date, time) function.
043: */
044:
045: public class TimestampOperatorNode extends BinaryOperatorNode {
046:
047: /**
048: * Initailizer for a TimestampOperatorNode.
049: *
050: * @param date The date
051: * @param time The time
052: */
053:
054: public void init(Object date, Object time) {
055: leftOperand = (ValueNode) date;
056: rightOperand = (ValueNode) time;
057: operator = "timestamp";
058: methodName = "getTimestamp";
059: }
060:
061: /**
062: * Bind this expression. This means binding the sub-expressions,
063: * as well as figuring out what the return type is for this expression.
064: *
065: * @param fromList The FROM list for the query this
066: * expression is in, for binding columns.
067: * @param subqueryList The subquery list being built as we find SubqueryNodes
068: * @param aggregateVector The aggregate vector being built as we find AggregateNodes
069: *
070: * @return The new top of the expression tree.
071: *
072: * @exception StandardException Thrown on error
073: */
074:
075: public ValueNode bindExpression(FromList fromList,
076: SubqueryList subqueryList, Vector aggregateVector)
077: throws StandardException {
078: leftOperand = leftOperand.bindExpression(fromList,
079: subqueryList, aggregateVector);
080: rightOperand = rightOperand.bindExpression(fromList,
081: subqueryList, aggregateVector);
082:
083: //Set the type if there is a parameter involved here
084: if (leftOperand.requiresTypeFromContext())
085: leftOperand.setType(DataTypeDescriptor
086: .getBuiltInDataTypeDescriptor(Types.DATE));
087: //Set the type if there is a parameter involved here
088: if (rightOperand.requiresTypeFromContext())
089: rightOperand.setType(DataTypeDescriptor
090: .getBuiltInDataTypeDescriptor(Types.TIME));
091:
092: TypeId leftTypeId = leftOperand.getTypeId();
093: TypeId rightTypeId = rightOperand.getTypeId();
094: if (!(leftOperand.requiresTypeFromContext()
095: || leftTypeId.isStringTypeId() || leftTypeId
096: .getJDBCTypeId() == Types.DATE))
097: throw StandardException.newException(
098: SQLState.LANG_BINARY_OPERATOR_NOT_SUPPORTED,
099: operator, leftTypeId.getSQLTypeName(), rightTypeId
100: .getSQLTypeName());
101: if (!(rightOperand.requiresTypeFromContext()
102: || rightTypeId.isStringTypeId() || rightTypeId
103: .getJDBCTypeId() == Types.TIME))
104: throw StandardException.newException(
105: SQLState.LANG_BINARY_OPERATOR_NOT_SUPPORTED,
106: operator, leftTypeId.getSQLTypeName(), rightTypeId
107: .getSQLTypeName());
108: setType(DataTypeDescriptor
109: .getBuiltInDataTypeDescriptor(Types.TIMESTAMP));
110: return genSQLJavaSQLTree();
111: } // end of bindExpression
112:
113: /**
114: * Do code generation for this binary operator.
115: *
116: * @param acb The ExpressionClassBuilder for the class we're generating
117: * @param mb The method the code to place the code
118: *
119: *
120: * @exception StandardException Thrown on error
121: */
122:
123: public void generateExpression(ExpressionClassBuilder acb,
124: MethodBuilder mb) throws StandardException {
125: acb.pushDataValueFactory(mb);
126: leftOperand.generateExpression(acb, mb);
127: mb.cast(ClassName.DataValueDescriptor);
128: rightOperand.generateExpression(acb, mb);
129: mb.cast(ClassName.DataValueDescriptor);
130: mb.callMethod(VMOpcode.INVOKEINTERFACE, null, methodName,
131: ClassName.DateTimeDataValue, 2);
132: } // end of generateExpression
133: }
|