org.apache.derby.impl.sql.compile
Class DMLModStatementNode

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
              extended byorg.apache.derby.impl.sql.compile.DMLModStatementNode
All Implemented Interfaces:
Visitable
Direct Known Subclasses:
DeleteNode, InsertNode, UpdateNode

public abstract class DMLModStatementNode
extends DMLStatementNode

A DMLStatement for a table modification: to wit, INSERT UPDATE or DELETE.

Author:
Jamie

Field Summary
private  boolean bound
           
private  ValueNode checkConstraints
           
protected  int[][] fkColArrays
           
protected  ColumnDescriptorList[] fkColDescriptors
           
protected  long[] fkIndexConglomNumbers
           
protected  FKInfo[] fkInfo
           
protected  int[] fkRefActions
           
protected  java.lang.String[] fkTableNames
           
protected  java.util.Hashtable graphHashTable
           
 long[] indexConglomerateNumbers
           
 java.lang.String[] indexNames
           
 IndexRowGenerator[] indicesToMaintain
           
protected  boolean isDependentTable
           
protected  int lockMode
           
protected  ConstraintDescriptorList relevantCdl
           
protected  GenericDescriptorList relevantTriggers
           
private  boolean requiresDeferredProcessing
           
protected  ResultColumnList resultColumnList
           
private  int statementType
           
 TableDescriptor targetTableDescriptor
           
protected  TableName targetTableName
           
protected  FromVTI targetVTI
           
protected  TriggerInfo triggerInfo
           
 
Fields inherited from class org.apache.derby.impl.sql.compile.DMLStatementNode
resultSet
 
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
DMLModStatementNode()
           
 
Method Summary
protected  void adjustDeferredFlag(boolean adjustment)
           
 void bindCheckConstraint(NodeFactory nodeFactory, TableDescriptor targetTableDescriptor, ResultColumnList sourceRCL, ValueNode checkConstraint)
          Binds an already parsed check constraint
 ValueNode bindConstraints(DataDictionary dataDictionary, NodeFactory nodeFactory, TableDescriptor targetTableDescriptor, Dependent dependent, ResultColumnList sourceRCL, int[] changedColumnIds, FormatableBitSet readColsBitSet, boolean skipCheckConstraints, boolean includeTriggers)
          Gets and binds all the constraints for an INSERT/UPDATE/DELETE.
private  void createConstraintDependencies(DataDictionary dd, ConstraintDescriptorList cdl, Dependent dependent)
          Get all of our dependents due to a constraint.
private  void createTriggerDependencies(GenericDescriptorList tdl, Dependent dependent)
          Makes the calling object (usually a Statement) dependent on all the constraints.
private  void fkSetupArrays(DataDictionary dd, ForeignKeyConstraintDescriptor fkcd, int index, UUID[] uuids, long[] conglomNumbers, java.lang.String[] fkNames, boolean[] isSelfReferencingFK, int[] raRules)
           
 MethodBuilder generateCheckConstraints(ValueNode checkConstraints, ExpressionClassBuilder ecb)
          Generate a method to evaluate a tree of CHECK CONSTRAINTS.
 void generateCheckConstraints(ValueNode checkConstraints, ExpressionClassBuilder ecb, MethodBuilder mb)
          Generate the code to evaluate a tree of CHECK CONSTRAINTS.
private  ValueNode generateCheckTree(ConstraintDescriptorList cdl, TableDescriptor td)
          Get the ANDing of all appropriate check constraints as 1 giant query tree.
protected  void generateCodeForTemporaryTable(ActivationClassBuilder acb, MethodBuilder mb)
          If the DML is on a temporary table, generate the code to mark temporary table as modified in the current UOW.
private  void generateFKInfo(ConstraintDescriptorList cdl, DataDictionary dd, TableDescriptor td, FormatableBitSet readColsBitSet)
          Generate the FKInfo structures used during code generation.
private  void generateTriggerInfo(GenericDescriptorList triggerList, TableDescriptor td, int[] changedCols)
          Generate the TriggerInfo structures used during code generation.
protected  void getAffectedIndexes(TableDescriptor td, ResultColumnList updatedColumns, FormatableBitSet colBitSet)
          Get the list of indexes that must be updated by this DML statement.
protected  ConstraintDescriptorList getAllRelevantConstraints(DataDictionary dd, TableDescriptor td, boolean skipCheckConstraints, int[] changedColumnIds)
          Get all the constraints relevant to this DML operation
protected  GenericDescriptorList getAllRelevantTriggers(DataDictionary dd, TableDescriptor td, int[] changedColumnIds, boolean includeTriggers)
          Get all the triggers relevant to this DML operation
 ValueNode getCheckConstraints()
          Get the check constraints for this node
 FKInfo[] getFKInfo()
          Return the FKInfo structure.
static int[] getReadColMap(int column_map_length, FormatableBitSet readColsBitSet)
          Get a map to efficiently find heap columns from a compressed set of read columns.
protected  void getResultColumnList()
          Get and bind the ResultColumnList representing the columns in the target table, given the table's name.
private  void getResultColumnList(FromBaseTable fromBaseTable, ResultColumnList inputRcl)
          Get and bind the ResultColumnList representing the columns in the target table, given a FromTable for the target table.
protected  FromBaseTable getResultColumnList(ResultColumnList inputRcl)
          Get and bind the ResultColumnList representing the columns in the target table, given the table's name.
private  int[] getRowMap(FormatableBitSet bitSet, TableDescriptor td)
          Get a integer based row map from a bit set.
 SchemaDescriptor getSchemaDescriptor()
          Get a schema descriptor for the given table.
 TriggerInfo getTriggerInfo()
          Return the TriggerInfo structure.
(package private) static void getXAffectedIndexes(TableDescriptor baseTable, ResultColumnList updatedColumns, FormatableBitSet colBitSet, java.util.Vector conglomVector)
          Marks which indexes are affected by an UPDATE of the desired shape.
protected  boolean hasCheckConstraints(DataDictionary dd, TableDescriptor td)
          Determine whether or not there are check constraints on the specified table.
 void init(java.lang.Object resultSet)
          Initializer for a DMLModStatementNode -- delegate to DMLStatementNode
 void init(java.lang.Object resultSet, java.lang.Object statementType)
          Initializer for a DMLModStatementNode -- delegate to DMLStatementNode
 boolean isAtomic()
          INSERT/UPDATE/DELETE are always atomic.
protected  void markAffectedIndexes(java.util.Vector affectedConglomerates)
           
 QueryTreeNode optimize()
          Generate an optimized QueryTree from a bound QueryTree.
 ValueNode parseCheckConstraint(java.lang.String checkConstraintText, TableDescriptor td)
          Parse a check constraint and turn it into a query tree.
private  int[] remapReferencedColumns(ConstraintDescriptor cd, int[] rowMap)
          Remap referenced columns in the cd to reflect the passed in row map.
 boolean requiresDeferredProcessing()
          Does this DML Node require deferred processing?
 void setRefActionInfo(long fkIndexConglomId, int[] fkColArray, java.lang.String parentResultSetId, boolean dependentScan)
          set the Information gathered from the parent table that is required to peform a referential action on dependent table.
(package private)  void setTarget(QueryTreeNode targetName)
           
 java.lang.String statementToString()
           
(package private)  void verifyTargetTable()
          Verify the target table.
 
Methods inherited from class org.apache.derby.impl.sql.compile.DMLStatementNode
accept, activationKind, bind, bindExpressions, bindExpressionsWithTables, bindResultSetsWithTables, bindTables, generateParameterHolders, generateParameterValueSet, getResultSetNode, makeResultDescription, printSubNodes
 
Methods inherited from class org.apache.derby.impl.sql.compile.StatementNode
generate, lockTableForCompilation, 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, isInstanceOf, isSessionSchema, isSessionSchema, makeConstantAction, makeTableName, needsSavepoint, nodeHeader, parseQueryText, printLabel, referencesSessionSchema, resolveTableToSynonym, setBeginOffset, setContextManager, setEndOffset, setNodeType, treePrint, treePrint, verifyClassExist
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

targetVTI

protected FromVTI targetVTI

targetTableName

protected TableName targetTableName

resultColumnList

protected ResultColumnList resultColumnList

lockMode

protected int lockMode

fkInfo

protected FKInfo[] fkInfo

triggerInfo

protected TriggerInfo triggerInfo

targetTableDescriptor

public TableDescriptor targetTableDescriptor

indicesToMaintain

public IndexRowGenerator[] indicesToMaintain

indexConglomerateNumbers

public long[] indexConglomerateNumbers

indexNames

public java.lang.String[] indexNames

relevantCdl

protected ConstraintDescriptorList relevantCdl

relevantTriggers

protected GenericDescriptorList relevantTriggers

requiresDeferredProcessing

private boolean requiresDeferredProcessing

statementType

private int statementType

bound

private boolean bound

checkConstraints

private ValueNode checkConstraints

fkTableNames

protected java.lang.String[] fkTableNames

fkRefActions

protected int[] fkRefActions

fkColDescriptors

protected ColumnDescriptorList[] fkColDescriptors

fkIndexConglomNumbers

protected long[] fkIndexConglomNumbers

isDependentTable

protected boolean isDependentTable

fkColArrays

protected int[][] fkColArrays

graphHashTable

protected java.util.Hashtable graphHashTable
Constructor Detail

DMLModStatementNode

public DMLModStatementNode()
Method Detail

init

public void init(java.lang.Object resultSet)
Initializer for a DMLModStatementNode -- delegate to DMLStatementNode

Overrides:
init in class DMLStatementNode
Parameters:
resultSet - A ResultSetNode for the result set of the DML statement

init

public void init(java.lang.Object resultSet,
                 java.lang.Object statementType)
Initializer for a DMLModStatementNode -- delegate to DMLStatementNode

Overrides:
init in class QueryTreeNode
Parameters:
resultSet - A ResultSetNode for the result set of the DML statement
statementType - used by nodes that allocate a DMLMod directly (rather than inheriting it).

setTarget

void setTarget(QueryTreeNode targetName)

generateCodeForTemporaryTable

protected void generateCodeForTemporaryTable(ActivationClassBuilder acb,
                                             MethodBuilder mb)
                                      throws StandardException
If the DML is on a temporary table, generate the code to mark temporary table as modified in the current UOW. At rollback transaction (or savepoint), we will check if the temporary table was modified in that UOW. If yes, we will remove all the data from the temporary table

Parameters:
acb - The ActivationClassBuilder for the class being built
mb - The execute() method to be built
Throws:
StandardException - Thrown on error

verifyTargetTable

void verifyTargetTable()
                 throws StandardException
Verify the target table. Get the TableDescriptor if the target table is not a VTI.

Throws:
StandardException - Thrown on error

isAtomic

public boolean isAtomic()
INSERT/UPDATE/DELETE are always atomic.

Overrides:
isAtomic in class DMLStatementNode
Returns:
true

getSchemaDescriptor

public SchemaDescriptor getSchemaDescriptor()
                                     throws StandardException
Get a schema descriptor for the given table. Uses this.targetTableName.

Returns:
Schema Descriptor
Throws:
StandardException - throws on schema name that doesn't exist

getReadColMap

public static int[] getReadColMap(int column_map_length,
                                  FormatableBitSet readColsBitSet)
Get a map to efficiently find heap columns from a compressed set of read columns. The returns a map such that
          map[heapColId (0 based)] -> readCol id (0 based)
          

Parameters:
column_map_length - The number of columns(ints) in the map.
readColsBitSet - A language style (1 based) bit set with bits for read heap columns set. RESOLVE: Replace this with a call to RowUtil when the store and the language both use 0 base or 1 base offsets for columns. Today we can't use the store function because we have a 1 based FormatableBitSet.

getResultColumnList

protected void getResultColumnList()
                            throws StandardException
Get and bind the ResultColumnList representing the columns in the target table, given the table's name.

Throws:
StandardException - Thrown on error

getResultColumnList

protected FromBaseTable getResultColumnList(ResultColumnList inputRcl)
                                     throws StandardException
Get and bind the ResultColumnList representing the columns in the target table, given the table's name.

Throws:
StandardException - Thrown on error

getResultColumnList

private void getResultColumnList(FromBaseTable fromBaseTable,
                                 ResultColumnList inputRcl)
                          throws StandardException
Get and bind the ResultColumnList representing the columns in the target table, given a FromTable for the target table.

Throws:
StandardException - Thrown on error

bindConstraints

public ValueNode bindConstraints(DataDictionary dataDictionary,
                                 NodeFactory nodeFactory,
                                 TableDescriptor targetTableDescriptor,
                                 Dependent dependent,
                                 ResultColumnList sourceRCL,
                                 int[] changedColumnIds,
                                 FormatableBitSet readColsBitSet,
                                 boolean skipCheckConstraints,
                                 boolean includeTriggers)
                          throws StandardException
Gets and binds all the constraints for an INSERT/UPDATE/DELETE. First finds the constraints that are relevant to this node. This is done by calling getAllRelevantConstriants(). If getAllRelevantConstraints() has already been called, then this list is used. Then it creates appropriate dependencies. Then binds check constraints. It also generates the array of FKInfo items that are used in code generation. Note: we have a new flag here to see if defer processing is enabled or not, the only scenario that is disabled is when we reapply the reply message we get from the source

Parameters:
dataDictionary - The DataDictionary
nodeFactory - Where to get query tree nodes.
targetTableDescriptor - The TableDescriptor
dependent - Parent object that will depend on all the constraints that we look up. If this argument is null, then we use the default dependent (the statement being compiled).
sourceRCL - RCL of the table being changed
changedColumnIds - If null, all columns being changed, otherwise array of 1-based column ids for columns being changed
readColsBitSet - bit set for the read scan
skipCheckConstraints - whether to skip check constraints or not
includeTriggers - whether triggers are included in the processing
Returns:
The bound, ANDed check constraints as a query tree.
Throws:
StandardException - Thrown on failure

bindCheckConstraint

public void bindCheckConstraint(NodeFactory nodeFactory,
                                TableDescriptor targetTableDescriptor,
                                ResultColumnList sourceRCL,
                                ValueNode checkConstraint)
                         throws StandardException
Binds an already parsed check constraint

Parameters:
nodeFactory - Where to get query tree nodes.
targetTableDescriptor - The TableDescriptor for the constrained table.
checkConstraint - Parsed query tree for check constraint
Returns:
The bound check constraint tree.
Throws:
StandardException - Thrown on failure

hasCheckConstraints

protected boolean hasCheckConstraints(DataDictionary dd,
                                      TableDescriptor td)
                               throws StandardException
Determine whether or not there are check constraints on the specified table.

Parameters:
dd - The DataDictionary to use
td - The TableDescriptor for the table
Returns:
Whether or not there are check constraints on the specified table.
Throws:
StandardException - Thrown on failure

generateCheckTree

private ValueNode generateCheckTree(ConstraintDescriptorList cdl,
                                    TableDescriptor td)
                             throws StandardException
Get the ANDing of all appropriate check constraints as 1 giant query tree. Makes the calling object (usually a Statement) dependent on all the constraints.

Parameters:
cdl - The constriant descriptor list
td - The TableDescriptor
Returns:
The ANDing of all appropriate check constraints as a query tree.
Throws:
StandardException - Thrown on failure

generateFKInfo

private void generateFKInfo(ConstraintDescriptorList cdl,
                            DataDictionary dd,
                            TableDescriptor td,
                            FormatableBitSet readColsBitSet)
                     throws StandardException
Generate the FKInfo structures used during code generation. For each constraint that isn't a check constraint, add another one of these FKInfo structures and then package them up into a single array.

Parameters:
cdl - The constriant descriptor list
dd - The DataDictionary
td - The TableDescriptor
readColsBitSet - columns read
Throws:
StandardException - Thrown on failure

fkSetupArrays

private void fkSetupArrays(DataDictionary dd,
                           ForeignKeyConstraintDescriptor fkcd,
                           int index,
                           UUID[] uuids,
                           long[] conglomNumbers,
                           java.lang.String[] fkNames,
                           boolean[] isSelfReferencingFK,
                           int[] raRules)
                    throws StandardException
Throws:
StandardException

generateTriggerInfo

private void generateTriggerInfo(GenericDescriptorList triggerList,
                                 TableDescriptor td,
                                 int[] changedCols)
                          throws StandardException
Generate the TriggerInfo structures used during code generation.

Parameters:
td - The TableDescriptor
changedCols - The columns that are being modified
Throws:
StandardException - Thrown on failure

getFKInfo

public FKInfo[] getFKInfo()
Return the FKInfo structure. Just a little wrapper to make sure we don't try to access it until after binding.

Returns:
the array of fkinfos

getTriggerInfo

public TriggerInfo getTriggerInfo()
Return the TriggerInfo structure. Just a little wrapper to make sure we don't try to access it until after binding.

Returns:
the trigger info

getCheckConstraints

public ValueNode getCheckConstraints()
Get the check constraints for this node

Returns:
the check constraints, may be null

createTriggerDependencies

private void createTriggerDependencies(GenericDescriptorList tdl,
                                       Dependent dependent)
                                throws StandardException
Makes the calling object (usually a Statement) dependent on all the constraints.

Parameters:
tdl - The trigger descriptor list
dependent - Parent object that will depend on all the constraints that we look up. If this argument is null, then we use the default dependent (the statement being compiled).
Throws:
StandardException - Thrown on failure

getAllRelevantTriggers

protected GenericDescriptorList getAllRelevantTriggers(DataDictionary dd,
                                                       TableDescriptor td,
                                                       int[] changedColumnIds,
                                                       boolean includeTriggers)
                                                throws StandardException
Get all the triggers relevant to this DML operation

Parameters:
dd - The data dictionary
td - The TableDescriptor
changedColumnIds - If null, all columns being changed, otherwise array of 1-based column ids for columns being changed
includeTriggers - whether we allow trigger processing or not for this table
Returns:
the constraint descriptor list
Throws:
StandardException - Thrown on failure

adjustDeferredFlag

protected void adjustDeferredFlag(boolean adjustment)

createConstraintDependencies

private void createConstraintDependencies(DataDictionary dd,
                                          ConstraintDescriptorList cdl,
                                          Dependent dependent)
                                   throws StandardException
Get all of our dependents due to a constraint. Makes the calling object (usually a Statement) dependent on all the constraints.

Parameters:
dd - The data dictionary
cdl - The constraint descriptor list
dependent - Parent object that will depend on all the constraints that we look up. If this argument is null, then we use the default dependent (the statement being compiled).
Throws:
StandardException - Thrown on failure

getAllRelevantConstraints

protected ConstraintDescriptorList getAllRelevantConstraints(DataDictionary dd,
                                                             TableDescriptor td,
                                                             boolean skipCheckConstraints,
                                                             int[] changedColumnIds)
                                                      throws StandardException
Get all the constraints relevant to this DML operation

Parameters:
dd - The DataDictionary
td - The TableDescriptor
skipCheckConstraints - Skip check constraints
changedColumnIds - If null, all columns being changed, otherwise array of 1-based column ids for columns being changed
Returns:
the constraint descriptor list
Throws:
StandardException - Thrown on failure

requiresDeferredProcessing

public boolean requiresDeferredProcessing()
Does this DML Node require deferred processing? Set to true if we have triggers or referential constraints that need deferred processing.

Returns:
true/false

parseCheckConstraint

public ValueNode parseCheckConstraint(java.lang.String checkConstraintText,
                                      TableDescriptor td)
                               throws StandardException
Parse a check constraint and turn it into a query tree.

Parameters:
checkConstraintText - Text of CHECK CONSTRAINT.
td - The TableDescriptor for the table the the constraint is on.
Returns:
The parsed check constraint as a query tree.
Throws:
StandardException - Thrown on failure

generateCheckConstraints

public void generateCheckConstraints(ValueNode checkConstraints,
                                     ExpressionClassBuilder ecb,
                                     MethodBuilder mb)
                              throws StandardException
Generate the code to evaluate a tree of CHECK CONSTRAINTS.

Parameters:
checkConstraints - Bound query tree of ANDed check constraints.
ecb - Expression Class Builder
Throws:
StandardException - Thrown on error

generateCheckConstraints

public MethodBuilder generateCheckConstraints(ValueNode checkConstraints,
                                              ExpressionClassBuilder ecb)
                                       throws StandardException
Generate a method to evaluate a tree of CHECK CONSTRAINTS.

Parameters:
checkConstraints - Bound query tree of ANDed check constraints.
ecb - Expression Class Builder
Throws:
StandardException - Thrown on error

optimize

public QueryTreeNode optimize()
                       throws StandardException
Generate an optimized QueryTree from a bound QueryTree. Actually, it can annotate the tree in place rather than generate a new tree, but this interface allows the root node of the optimized QueryTree to be different from the root node of the bound QueryTree. For non-optimizable statements, this method is a no-op. Throws an exception if the tree is not bound, or if the binding is out of date.

Overrides:
optimize in class DMLStatementNode
Returns:
An optimized QueryTree
Throws:
StandardException - Thrown on failure

getAffectedIndexes

protected void getAffectedIndexes(TableDescriptor td,
                                  ResultColumnList updatedColumns,
                                  FormatableBitSet colBitSet)
                           throws StandardException
Get the list of indexes that must be updated by this DML statement. WARNING: As a side effect, it creates dependencies on those indexes.

Parameters:
td - The table descriptor for the table being updated
updatedColumns - The updated column list. If not update, null
colBitSet - a 1 based bit set of the columns in the list
Throws:
StandardException - Thrown on error

getXAffectedIndexes

static void getXAffectedIndexes(TableDescriptor baseTable,
                                ResultColumnList updatedColumns,
                                FormatableBitSet colBitSet,
                                java.util.Vector conglomVector)
                         throws StandardException
Marks which indexes are affected by an UPDATE of the desired shape. Is passed a list of updated columns. Does the following: 1) finds all indices which overlap the updated columns 2) adds the index columns to a bitmap of affected columns 3) adds the index descriptors to a list of conglomerate descriptors.

Parameters:
updatedColumns - a list of updated columns
colBitSet - OUT: evolving bitmap of affected columns
conglomVector - OUT: vector of affected indices
Throws:
StandardException - Thrown on error

markAffectedIndexes

protected void markAffectedIndexes(java.util.Vector affectedConglomerates)
                            throws StandardException
Throws:
StandardException

statementToString

public java.lang.String statementToString()
Specified by:
statementToString in class StatementNode

remapReferencedColumns

private int[] remapReferencedColumns(ConstraintDescriptor cd,
                                     int[] rowMap)
Remap referenced columns in the cd to reflect the passed in row map.

Parameters:
cd - constraint descriptor
rowMap - 1 based row map

getRowMap

private int[] getRowMap(FormatableBitSet bitSet,
                        TableDescriptor td)
                 throws StandardException
Get a integer based row map from a bit set.

Parameters:
bitSet -
td -
Throws:
StandardException

setRefActionInfo

public void setRefActionInfo(long fkIndexConglomId,
                             int[] fkColArray,
                             java.lang.String parentResultSetId,
                             boolean dependentScan)
Description copied from class: QueryTreeNode
set the Information gathered from the parent table that is required to peform a referential action on dependent table.

Overrides:
setRefActionInfo in class QueryTreeNode
Returns:
Nothing.

Built on Tue 2006-10-10 19:23:47+0200, from revision exported

Apache Derby V10.1 Engine Documentation - Copyright © 1997,2005 The Apache Software Foundation or its licensors, as applicable.