/* * Copyright (c) 2013, OpenCloudDB/MyCAT and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software;Designed and Developed mainly by many Chinese * opensource volunteers. you can redistribute it and/or modify it under the * terms of the GNU General Public License version 2 only, as published by the * Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Any questions about this component can be directed to it's project Web address * https://code.google.com/p/opencloudb/. * */ package com.akiban.sql.parser; import com.akiban.sql.StandardException; import com.akiban.sql.types.DataTypeDescriptor; /** * A BaseColumnNode represents a column in a base table. The parser generates a * BaseColumnNode for each column reference. A column refercence could be a column in * a base table, a column in a view (which could expand into a complex * expression), or a column in a subquery in the FROM clause. By the time * we get to code generation, all BaseColumnNodes should stand only for columns * in base tables. * */ public class BaseColumnNode extends ValueNode { private String columnName; /* ** This is the user-specified table name. It will be null if the ** user specifies a column without a table name. */ private TableName tableName; /** * Initializer for when you only have the column name. * * @param columnName The name of the column being referenced * @param tableName The qualification for the column * @param type DataTypeDescriptor for the column */ public void init(Object columnName, Object tableName, Object type) throws StandardException { this.columnName = (String)columnName; this.tableName = (TableName)tableName; setType((DataTypeDescriptor)type); } /** * Fill this node with a deep copy of the given node. */ public void copyFrom(QueryTreeNode node) throws StandardException { super.copyFrom(node); BaseColumnNode other = (BaseColumnNode)node; this.columnName = other.columnName; this.tableName = (TableName)getNodeFactory().copyNode(other.tableName, getParserContext()); } /** * Convert this object to a String. See comments in QueryTreeNode.java * for how this should be done for tree printing. * * @return This object as a String */ public String toString() { return "columnName: " + columnName + "\n" + "tableName: " + ( ( tableName != null) ? tableName.toString() : "null") + "\n" + super.toString(); } /** * Get the name of this column * * @return The name of this column */ public String getColumnName() { return columnName; } /** * Get the user-supplied table name of this column. This will be null * if the user did not supply a name (for example, select a from t). * The method will return B for this example, select b.a from t as b * The method will return T for this example, select t.a from t * * @return The user-supplied name of this column. Null if no user- * supplied name. */ public String getTableName() { return ((tableName != null) ? tableName.getTableName() : null); } /** * Get the user-supplied schema name for this column's table. This will be null * if the user did not supply a name (for example, select t.a from t). * Another example for null return value (for example, select b.a from t as b). * But for following query select app.t.a from t, this will return APP * * @return The schema name for this column's table */ public String getSchemaName() throws StandardException { return ((tableName != null) ? tableName.getSchemaName() : null); } /** * {@inheritDoc} */ protected boolean isEquivalent(ValueNode o) { if (isSameNodeType(o)) { BaseColumnNode other = (BaseColumnNode)o; return other.tableName.equals(tableName) && other.columnName.equals(columnName); } return false; } }