001: /*
002:
003: Derby - Class org.apache.derby.impl.sql.compile.UntypedNullConstantNode
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.services.compiler.MethodBuilder;
025:
026: import org.apache.derby.iapi.services.sanity.SanityManager;
027:
028: import org.apache.derby.iapi.error.StandardException;
029:
030: import org.apache.derby.iapi.types.DataValueDescriptor;
031: import org.apache.derby.iapi.types.DataTypeDescriptor;
032:
033: import org.apache.derby.impl.sql.compile.ExpressionClassBuilder;
034:
035: import java.util.Vector;
036:
037: /**
038: * An UntypedNullConstantNode represents a SQL NULL before it has
039: * been bound. The bind() operation will replace the UntypedNullConstantNodes
040: * with typed ConstantNodes.
041: */
042:
043: public final class UntypedNullConstantNode extends ConstantNode {
044: /**
045: * Constructor for an UntypedNullConstantNode. Untyped constants
046: * contain no state (not too surprising).
047: */
048:
049: public UntypedNullConstantNode() {
050: super ();
051: }
052:
053: /**
054: * Return the length
055: *
056: * @return The length of the value this node represents
057: *
058: */
059:
060: //public int getLength()
061: //{
062: // if (SanityManager.DEBUG)
063: // SanityManager.ASSERT(false,
064: // "Unimplemented method - should not be called on UntypedNullConstantNode");
065: // return 0;
066: //}
067: /**
068: * Should never be called for UntypedNullConstantNode because
069: * we shouldn't make it to generate
070: *
071: * @param acb The ExpressionClassBuilder for the class being built
072: * @param mb The method the expression will go into
073: */
074: void generateConstant(ExpressionClassBuilder acb, MethodBuilder mb) {
075: if (SanityManager.DEBUG) {
076: SanityManager
077: .THROWASSERT("generateConstant() not expected to be called for UntypedNullConstantNode because we have implemented our own generateExpression().");
078: }
079: }
080:
081: /**
082: * Translate a Default node into a default value, given a type descriptor.
083: *
084: * @param typeDescriptor A description of the required data type.
085: *
086: */
087: public DataValueDescriptor convertDefaultNode(
088: DataTypeDescriptor typeDescriptor) {
089: /*
090: ** The default value is null, so set nullability to TRUE
091: */
092: return typeDescriptor.getNull();
093: }
094:
095: /** @see ValueNode#bindExpression(FromList, SubqueryList, Vector)
096: * @see ResultColumnList#bindUntypedNullsToResultColumns
097: * This does nothing-- the node is actually bound when
098: * bindUntypedNullsToResultColumns is called.
099: */
100: public ValueNode bindExpression(FromList fromList,
101: SubqueryList subqueryList, Vector aggregateVector) {
102: return this;
103: }
104: }
|