001: /*
002:
003: Derby - Class org.apache.derby.impl.sql.compile.BaseColumnNode
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.error.StandardException;
027: import org.apache.derby.iapi.reference.SQLState;
028:
029: import org.apache.derby.iapi.types.DataTypeDescriptor;
030: import org.apache.derby.iapi.sql.Row;
031:
032: import org.apache.derby.iapi.store.access.Qualifier;
033:
034: import org.apache.derby.impl.sql.compile.ExpressionClassBuilder;
035:
036: import org.apache.derby.iapi.services.compiler.MethodBuilder;
037: import org.apache.derby.iapi.services.sanity.SanityManager;
038:
039: /**
040: * A BaseColumnNode represents a column in a base table. The parser generates a
041: * BaseColumnNode for each column reference. A column refercence could be a column in
042: * a base table, a column in a view (which could expand into a complex
043: * expression), or a column in a subquery in the FROM clause. By the time
044: * we get to code generation, all BaseColumnNodes should stand only for columns
045: * in base tables.
046: *
047: * @author Jeff Lichtman
048: */
049:
050: public class BaseColumnNode extends ValueNode {
051: private String columnName;
052:
053: /*
054: ** This is the user-specified table name. It will be null if the
055: ** user specifies a column without a table name.
056: */
057: private TableName tableName;
058:
059: /**
060: * Initializer for when you only have the column name.
061: *
062: * @param columnName The name of the column being referenced
063: * @param tableName The qualification for the column
064: * @param dts DataTypeServices for the column
065: */
066:
067: public void init(Object columnName, Object tableName, Object dts)
068: throws StandardException {
069: this .columnName = (String) columnName;
070: this .tableName = (TableName) tableName;
071: setType((DataTypeDescriptor) dts);
072: }
073:
074: /**
075: * Convert this object to a String. See comments in QueryTreeNode.java
076: * for how this should be done for tree printing.
077: *
078: * @return This object as a String
079: */
080:
081: public String toString() {
082: if (SanityManager.DEBUG) {
083: return "columnName: "
084: + columnName
085: + "\n"
086: + ((tableName != null) ? tableName.toString()
087: : "tableName: null\n") + super .toString();
088: } else {
089: return "";
090: }
091: }
092:
093: /**
094: * Get the name of this column
095: *
096: * @return The name of this column
097: */
098:
099: public String getColumnName() {
100: return columnName;
101: }
102:
103: /**
104: * Get the user-supplied table name of this column. This will be null
105: * if the user did not supply a name (for example, select a from t).
106: * The method will return B for this example, select b.a from t as b
107: * The method will return T for this example, select t.a from t
108: *
109: * @return The user-supplied name of this column. Null if no user-
110: * supplied name.
111: */
112:
113: public String getTableName() {
114: return ((tableName != null) ? tableName.getTableName() : null);
115: }
116:
117: /**
118: * Get the user-supplied schema name for this column's table. This will be null
119: * if the user did not supply a name (for example, select t.a from t).
120: * Another example for null return value (for example, select b.a from t as b).
121: * But for following query select app.t.a from t, this will return APP
122: *
123: * @return The schema name for this column's table
124: */
125: public String getSchemaName() throws StandardException {
126: return ((tableName != null) ? tableName.getSchemaName() : null);
127: }
128:
129: /**
130: * Do the code generation for this node. Should never be called.
131: *
132: * @param acb The ExpressionClassBuilder for the class being built
133: * @param mb The method the code to place the code
134: *
135: *
136: * @exception StandardException Thrown on error
137: */
138:
139: public void generateExpression(ExpressionClassBuilder acb,
140: MethodBuilder mb) throws StandardException {
141: throw StandardException.newException(
142: SQLState.LANG_UNABLE_TO_GENERATE, this .nodeHeader());
143: }
144:
145: /**
146: * Return the variant type for the underlying expression.
147: * The variant type can be:
148: * VARIANT - variant within a scan
149: * (method calls and non-static field access)
150: * SCAN_INVARIANT - invariant within a scan
151: * (column references from outer tables)
152: * QUERY_INVARIANT - invariant within the life of a query
153: * (constant expressions)
154: *
155: * @return The variant type for the underlying expression.
156: */
157: protected int getOrderableVariantType() {
158: return Qualifier.SCAN_INVARIANT;
159: }
160:
161: /**
162: * {@inheritDoc}
163: */
164: protected boolean isEquivalent(ValueNode o) {
165: if (isSameNodeType(o)) {
166: BaseColumnNode other = (BaseColumnNode) o;
167: return other.tableName.equals(other.tableName)
168: && other.columnName.equals(columnName);
169: }
170: return false;
171: }
172: }
|