Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

org.apache.derby.impl.sql.compile
Class DMLStatementNode  view DMLStatementNode download DMLStatementNode.java

java.lang.Object
  extended byorg.apache.derby.impl.sql.compile.QueryTreeNode
      extended byorg.apache.derby.impl.sql.compile.StatementNode
          extended byorg.apache.derby.impl.sql.compile.DMLStatementNode
All Implemented Interfaces:
org.apache.derby.iapi.sql.compile.Visitable
Direct Known Subclasses:
CallStatementNode, DMLModStatementNode, ReadCursorNode

public abstract class DMLStatementNode
extends StatementNode

A DMLStatementNode represents any type of DML statement: a cursor declaration, an INSERT statement, and UPDATE statement, or a DELETE statement. All DML statements have result sets, but they do different things with them. A SELECT statement sends its result set to the client, an INSERT statement inserts its result set into a table, a DELETE statement deletes from a table the rows corresponding to the rows in its result set, and an UPDATE statement updates the rows in a base table corresponding to the rows in its result set.


Field Summary
 ResultSetNode resultSet
          The result set is the rows that result from running the statement.
 
Fields inherited from class org.apache.derby.impl.sql.compile.StatementNode
NEED_CURSOR_ACTIVATION, NEED_DDL_ACTIVATION, NEED_NOTHING_ACTIVATION, NEED_PARAM_ACTIVATION, NEED_ROW_ACTIVATION
 
Fields inherited from class org.apache.derby.impl.sql.compile.QueryTreeNode
AUTOINCREMENT_INC_INDEX, AUTOINCREMENT_IS_AUTOINCREMENT_INDEX, AUTOINCREMENT_START_INDEX, beginOffset, endOffset
 
Constructor Summary
DMLStatementNode()
           
 
Method Summary
 org.apache.derby.iapi.sql.compile.Visitable accept(org.apache.derby.iapi.sql.compile.Visitor v)
          Accept a visitor, and call v.visit() on child nodes as necessary.
(package private)  int activationKind()
          Returns the type of activation this class generates.
 QueryTreeNode bind(org.apache.derby.iapi.sql.dictionary.DataDictionary dataDictionary)
          Bind this DMLStatementNode.
protected  void bindExpressions()
          Bind the expressions in this DML statement.
protected  void bindExpressionsWithTables()
          Bind the expressions in the underlying ResultSets with tables.
 QueryTreeNode bindResultSetsWithTables(org.apache.derby.iapi.sql.dictionary.DataDictionary dataDictionary)
          Bind only the underlying ResultSets with tables.
protected  void bindTables(org.apache.derby.iapi.sql.dictionary.DataDictionary dataDictionary)
          Bind the tables in this DML statement.
(package private)  void generateParameterHolders(ActivationClassBuilder acb)
           
(package private)  void generateParameterValueSet(ActivationClassBuilder acb)
          Generate the code to create the ParameterValueSet, if necessary, when constructing the activation.
 ResultSetNode getResultSetNode()
          Get the ResultSetNode from this DML Statement.
 void init(java.lang.Object resultSet)
          Initializer for a DMLStatementNode
 boolean isAtomic()
          A read statement is atomic (DMLMod overrides us) if there are no work units, and no SELECT nodes, or if its SELECT nodes are all arguments to a function.
 org.apache.derby.iapi.sql.ResultDescription makeResultDescription()
          Make a ResultDescription for use in a PreparedStatement.
 QueryTreeNode optimize()
          Optimize a DML statement (which is the only type of statement that should need optimizing, I think).
 void printSubNodes(int depth)
          Prints the sub-nodes of this object.
 
Methods inherited from class org.apache.derby.impl.sql.compile.StatementNode
generate, lockTableForCompilation, statementToString, toString
 
Methods inherited from class org.apache.derby.impl.sql.compile.QueryTreeNode
bind, convertDefaultNode, debugFlush, debugPrint, executeSchemaName, executeStatementName, formatNodeString, foundString, generate, generateAuthorizeCheck, getBeginOffset, getClassFactory, getCompilerContext, getContextManager, getCursorInfo, getDataDictionary, getDependencyManager, getEndOffset, getExecutionFactory, getGenericConstantActionFactory, getIntProperty, getLanguageConnectionContext, getNodeFactory, getNodeType, getNullNode, getParameterTypes, getRowEstimate, getSchemaDescriptor, getSchemaDescriptor, getSPSName, getStatementType, getTableDescriptor, getTypeCompiler, init, init, init, init, init, init, init, init, init, init, init, init, init, isInstanceOf, isSessionSchema, isSessionSchema, makeConstantAction, makeTableName, needsSavepoint, nodeHeader, parseQueryText, printLabel, referencesSessionSchema, resolveTableToSynonym, setBeginOffset, setContextManager, setEndOffset, setNodeType, setRefActionInfo, treePrint, treePrint, verifyClassExist
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

resultSet

public ResultSetNode resultSet
The result set is the rows that result from running the statement. What this means for SELECT statements is fairly obvious. For a DELETE, there is one result column representing the key of the row to be deleted (most likely, the location of the row in the underlying heap). For an UPDATE, the row consists of the key of the row to be updated plus the updated columns. For an INSERT, the row consists of the new column values to be inserted, with no key (the system generates a key). The parser doesn't know anything about keys, so the columns representing the keys will be added after parsing (perhaps in the binding phase?). RESOLVE: This is public so RepDeleteNode can see it. Perhaps it should hava a public accessor function.

Constructor Detail

DMLStatementNode

public DMLStatementNode()
Method Detail

init

public void init(java.lang.Object resultSet)
Initializer for a DMLStatementNode

Overrides:
init in class QueryTreeNode

printSubNodes

public void printSubNodes(int depth)
Prints the sub-nodes of this object. See QueryTreeNode.java for how tree printing is supposed to work.

Overrides:
printSubNodes in class QueryTreeNode

getResultSetNode

public ResultSetNode getResultSetNode()
Get the ResultSetNode from this DML Statement. (Useful for view resolution after parsing the view definition.)


bind

public QueryTreeNode bind(org.apache.derby.iapi.sql.dictionary.DataDictionary dataDictionary)
                   throws org.apache.derby.iapi.error.StandardException
Bind this DMLStatementNode. This means looking up tables and columns and getting their types, and figuring out the result types of all expressions, as well as doing view resolution, permissions checking, etc.


bindResultSetsWithTables

public QueryTreeNode bindResultSetsWithTables(org.apache.derby.iapi.sql.dictionary.DataDictionary dataDictionary)
                                       throws org.apache.derby.iapi.error.StandardException
Bind only the underlying ResultSets with tables. This is necessary for INSERT, where the binding order depends on the underlying ResultSets. This means looking up tables and columns and getting their types, and figuring out the result types of all expressions, as well as doing view resolution, permissions checking, etc.


bindTables

protected void bindTables(org.apache.derby.iapi.sql.dictionary.DataDictionary dataDictionary)
                   throws org.apache.derby.iapi.error.StandardException
Bind the tables in this DML statement.


bindExpressions

protected void bindExpressions()
                        throws org.apache.derby.iapi.error.StandardException
Bind the expressions in this DML statement.


bindExpressionsWithTables

protected void bindExpressionsWithTables()
                                  throws org.apache.derby.iapi.error.StandardException
Bind the expressions in the underlying ResultSets with tables.


activationKind

int activationKind()
Returns the type of activation this class generates.

Specified by:
activationKind in class StatementNode

optimize

public QueryTreeNode optimize()
                       throws org.apache.derby.iapi.error.StandardException
Optimize a DML statement (which is the only type of statement that should need optimizing, I think). This method over-rides the one in QueryTreeNode. This method takes a bound tree, and returns an optimized tree. It annotates the bound tree rather than creating an entirely new tree. Throws an exception if the tree is not bound, or if the binding is out of date.

Overrides:
optimize in class QueryTreeNode

makeResultDescription

public org.apache.derby.iapi.sql.ResultDescription makeResultDescription()
Make a ResultDescription for use in a PreparedStatement. ResultDescriptions are visible to JDBC only for cursor statements. For other types of statements, they are only used internally to get descriptions of the base tables being affected. For example, for an INSERT statement, the ResultDescription describes the rows in the table being inserted into, which is useful when the values being inserted are of a different type or length than the columns in the base table.

Overrides:
makeResultDescription in class QueryTreeNode

generateParameterValueSet

void generateParameterValueSet(ActivationClassBuilder acb)
                         throws org.apache.derby.iapi.error.StandardException
Generate the code to create the ParameterValueSet, if necessary, when constructing the activation. Also generate the code to call a method that will throw an exception if we try to execute without all the parameters being set.


generateParameterHolders

void generateParameterHolders(ActivationClassBuilder acb)
                        throws org.apache.derby.iapi.error.StandardException

isAtomic

public boolean isAtomic()
                 throws org.apache.derby.iapi.error.StandardException
A read statement is atomic (DMLMod overrides us) if there are no work units, and no SELECT nodes, or if its SELECT nodes are all arguments to a function. This is admittedly a bit simplistic, what if someone has:
 	VALUES myfunc(SELECT max(c.commitFunc()) FROM T) 
 
but we aren't going too far out of our way to catch every possible wierd case. We basically want to be permissive w/o allowing someone to partially commit a write.

Overrides:
isAtomic in class StatementNode

accept

public org.apache.derby.iapi.sql.compile.Visitable accept(org.apache.derby.iapi.sql.compile.Visitor v)
                                                   throws org.apache.derby.iapi.error.StandardException
Accept a visitor, and call v.visit() on child nodes as necessary.

Specified by:
accept in interface org.apache.derby.iapi.sql.compile.Visitable
Overrides:
accept in class QueryTreeNode