⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rowresultsetnode.java

📁 derby database source code.good for you.
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*   Derby - Class org.apache.derby.impl.sql.compile.RowResultSetNode   Copyright 1997, 2004 The Apache Software Foundation or its licensors, as applicable.   Licensed under the Apache License, Version 2.0 (the "License");   you may not use this file except in compliance with the License.   You may obtain a copy of the License at      http://www.apache.org/licenses/LICENSE-2.0   Unless required by applicable law or agreed to in writing, software   distributed under the License is distributed on an "AS IS" BASIS,   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   See the License for the specific language governing permissions and   limitations under the License. */package	org.apache.derby.impl.sql.compile;import org.apache.derby.iapi.services.context.ContextManager;import org.apache.derby.iapi.sql.compile.CompilerContext;import org.apache.derby.iapi.sql.compile.CostEstimate;import org.apache.derby.iapi.sql.compile.Optimizer;import org.apache.derby.iapi.sql.compile.OptimizableList;import org.apache.derby.iapi.sql.compile.Optimizable;import org.apache.derby.iapi.sql.compile.OptimizablePredicate;import org.apache.derby.iapi.sql.compile.OptimizablePredicateList;import org.apache.derby.iapi.sql.compile.RequiredRowOrdering;import org.apache.derby.iapi.sql.compile.RowOrdering;import org.apache.derby.iapi.sql.compile.C_NodeTypes;import org.apache.derby.iapi.sql.dictionary.DataDictionary;import org.apache.derby.iapi.sql.dictionary.ConglomerateDescriptor;import org.apache.derby.iapi.sql.dictionary.TableDescriptor;import org.apache.derby.iapi.sql.Activation;import org.apache.derby.iapi.sql.ResultSet;import org.apache.derby.iapi.sql.Row;import org.apache.derby.iapi.error.StandardException;import org.apache.derby.impl.sql.compile.ActivationClassBuilder;import org.apache.derby.iapi.services.compiler.MethodBuilder;import org.apache.derby.iapi.store.access.Qualifier;import org.apache.derby.iapi.services.sanity.SanityManager;import org.apache.derby.iapi.util.JBitSet;import org.apache.derby.iapi.reference.SQLState;import org.apache.derby.iapi.reference.ClassName;import org.apache.derby.iapi.services.classfile.VMOpcode;import java.util.Enumeration;import java.util.Properties;import java.util.Vector;/** * A RowResultSetNode represents the result set for a VALUES clause. * * @author Jerry Brenner */public class RowResultSetNode extends FromTable{	SubqueryList subquerys;	Vector		 aggregateVector;	OrderByList	 orderByList;	/**	 * Initializer for a RowResultSetNode.	 *	 * @param valuesClause	The result column list for the VALUES clause.	 * @param tableProperties	Properties list associated with the table	 */	public void init(Object valuesClause, Object tableProperties)	{		super.init(null, tableProperties);		resultColumns = (ResultColumnList) valuesClause;		if (resultColumns != null)			resultColumns.markInitialSize();	}	/**	 * 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()	{		if (SanityManager.DEBUG)		{			return 	"orderByList: " + 				(orderByList != null ? orderByList.toString() : "null") + "\n" +				super.toString();		}		else		{			return "";		}	}	public String statementToString()	{		return "VALUES";	}	/**	 * Prints the sub-nodes of this object.  See QueryTreeNode.java for	 * how tree printing is supposed to work.	 *	 * @param depth		The depth of this node in the tree	 *	 * @return	Nothing	 */	public void printSubNodes(int depth)	{		if (SanityManager.DEBUG)		{			super.printSubNodes(depth);			if (subquerys != null)			{				printLabel(depth, "subquerys: ");				subquerys.treePrint(depth + 1);			}		}	}	/*	 *  Optimizable interface	 */	/**	 * @see Optimizable#estimateCost	 *	 * @exception StandardException		Thrown on error	 */	public CostEstimate estimateCost(OptimizablePredicateList predList,										ConglomerateDescriptor cd,										CostEstimate outerCost,										Optimizer optimizer,										RowOrdering rowOrdering)								throws StandardException	{		/*		** Assume for now that the cost of a VALUES clause is zero, with one row		** fetched.  Is this true, and if not, does it make a difference?		** There's nothing to optimize in this case.		*/		if (costEstimate == null)		{			costEstimate = optimizer.newCostEstimate();		}		costEstimate.setCost(0.0d, 1.0d, 1.0d);		/* A single row is always ordered */		rowOrdering.optimizableAlwaysOrdered(this);		return costEstimate;	}	/**	 * Bind the non VTI tables in this ResultSetNode.  This includes getting their	 * descriptors from the data dictionary and numbering them.	 *	 * @param dataDictionary	The DataDictionary to use for binding	 * @param fromListParam		FromList to use/append to.	 *	 * @return	ResultSetNode	 *	 * @exception StandardException		Thrown on error	 */	public ResultSetNode bindNonVTITables(DataDictionary dataDictionary, 							FromList fromListParam) 					throws StandardException	{		/* Assign the tableNumber */		if (tableNumber == -1)  // allow re-bind, in which case use old number			tableNumber = getCompilerContext().getNextTableNumber();		/* VALUES clause has no tables, so nothing to do */		return this;	}	/**	 * Bind the expressions in this RowResultSetNode.  This means binding the	 * sub-expressions, as well as figuring out what the return type is	 * for each expression.	 *	 * @return	Nothing	 *	 * @exception StandardException		Thrown on error	 */	public void bindExpressions(FromList fromListParam)					throws StandardException	{		int nestingLevel;		subquerys = (SubqueryList) getNodeFactory().getNode(										C_NodeTypes.SUBQUERY_LIST,										getContextManager());		aggregateVector = new Vector();		/* Verify that there are no DEFAULTs in the RCL.		 * DEFAULT is only valid for an insert, and it has		 * already been coverted into the tree by the time we get here.		 * The grammar allows:		 *		VALUES DEFAULT;		 * so we need to check for that here and throw an exception if found.		 */		resultColumns.checkForInvalidDefaults();		/* Believe it or not, a values clause can contain correlated column references		 * and subqueries.  In order to get correlated column resolution working 		 * correctly, we need to set our nesting level to be 1 deeper than the current		 * level and push ourselves into the FROM list.  		 */		/* Set the nesting level in this node */		if (fromListParam.size() == 0)		{			nestingLevel = 0;		}		else		{			nestingLevel = ((FromTable) fromListParam.elementAt(0)).getLevel() + 1;		}		setLevel(nestingLevel);		fromListParam.insertElementAt(this, 0);		resultColumns.bindExpressions(fromListParam, subquerys,									  aggregateVector);		// Pop ourselves back out of the FROM list		fromListParam.removeElementAt(0);		if (aggregateVector.size() > 0)		{			throw StandardException.newException(SQLState.LANG_NO_AGGREGATES_IN_WHERE_CLAUSE);		}	}	/**	 * Bind the expressions in this ResultSetNode if it has tables.  This means binding the	 * sub-expressions, as well as figuring out what the return type is for	 * each expression.	 *	 * @param fromListParam		FromList to use/append to.	 *	 * @return	Nothing	 *	 * @exception StandardException		Thrown on error	 */	public void bindExpressionsWithTables(FromList fromListParam)					throws StandardException	{		/* We don't have any tables, so just return */		return;	}	/**	 * Bind the expressions in the target list.  This means binding the	 * sub-expressions, as well as figuring out what the return type is	 * for each expression.  This is useful for EXISTS subqueries, where we	 * need to validate the target list before blowing it away and replacing	 * it with a SELECT true.	 *	 * @return	Nothing	 *	 * @exception StandardException		Thrown on error	 */	public void bindTargetExpressions(FromList fromListParam)					throws StandardException	{		bindExpressions(fromListParam);	}	/**	 * Bind any untyped null nodes to the types in the given ResultColumnList.	 *	 * @param bindingRCL	The ResultColumnList with the types to bind to.	 *	 * @exception StandardException		Thrown on error	 */	public void bindUntypedNullsToResultColumns(ResultColumnList bindingRCL)				throws StandardException	{		/*		** If bindingRCL is null, then we are		** under a cursor node that is inferring		** its RCL from us.  It passes null to		** get union to use both sides of the union		** for the check.  Anyway, since there is		** nothing under us but an RCL, just pass		** in our RCL.		*/		if (bindingRCL == null)			bindingRCL = resultColumns;		resultColumns.bindUntypedNullsToResultColumns(bindingRCL);	}	/**	 * Try to find a ResultColumn in the table represented by this FromTable	 * that matches the name in the given ColumnReference.	 *	 * @param columnReference	The columnReference whose name we're looking	 *				for in the given table.	 *	 * @return	A ResultColumn whose expression is the ColumnNode	 *			that matches the ColumnReference.	 *		Returns null if there is no match.	 *	 * @exception StandardException		Thrown on error	 */	public ResultColumn getMatchingColumn(						ColumnReference columnReference)						throws StandardException	{		return null;	}	/**	 * Get the exposed name for this table, which is the name that can	 * be used to refer to it in the rest of the query.	 *	 * @return	The exposed name of this table.	 *	 * @exception StandardException		Thrown on error	 */	public String getExposedName() throws StandardException	{		return null;	}	/**	 * Verify that a SELECT * is valid for this type of subquery.	 *	 * @param outerFromList	The FromList from the outer query block(s)	 * @param subqueryType	The subquery type	 *	 * @return	None	 *	 * @exception StandardException		Thrown on error	 */	public void verifySelectStarSubquery(FromList outerFromList, int subqueryType) 					throws StandardException	{		return; 	}	/**	 * Push the order by list down from the cursor node	 * into its child result set so that the optimizer	 * has all of the information that it needs to 	 * consider sort avoidance.	 *	 * @param orderByList	The order by list	 *	 * @return Nothing.	 */	void pushOrderByList(OrderByList orderByList)	{		this.orderByList = orderByList;	}	/** 	 * Put a ProjectRestrictNode on top of each FromTable in the FromList.	 * ColumnReferences must continue to point to the same ResultColumn, so	 * that ResultColumn must percolate up to the new PRN.  However,	 * that ResultColumn will point to a new expression, a VirtualColumnNode, 	 * which points to the FromTable and the ResultColumn that is the source for	 * the ColumnReference.  	 * (The new PRN will have the original of the ResultColumnList and	 * the ResultColumns from that list.  The FromTable will get shallow copies	 * of the ResultColumnList and its ResultColumns.  ResultColumn.expression	 * will remain at the FromTable, with the PRN getting a new 	 * VirtualColumnNode for each ResultColumn.expression.)	 * We then project out the non-referenced columns.  If there are no referenced	 * columns, then the PRN's ResultColumnList will consist of a single ResultColumn	 * whose expression is 1.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -