Top Description Fields Methods
org.apache.derby.vti

public Interface DeferModification

Known Direct Implementers
org.apache.derby.impl.sql.compile.DefaultVTIModDeferPolicy
Imports
java.sql.SQLException

This interface is implemented by a read/write VTI class that wants to control when modifications to the VTI are deferred, or to be notified that a it is to be modified. Consider the following statement:
UPDATE NEW myVTI(...) SET cost = cost + 10 WHERE cost < 15

Updating a column that is used in the WHERE clause might or might not give the VTI implementation trouble; the update might cause the same row to be selected more than once. This problem can be solved by building the complete list of rows to be updated and the new column values before updating any rows. The updates are applied after the list is built. This process is called "deferred update".

By default, updates on a VTI are deferred when the VTI ResultSet is scrollable (ResultSet.TYPE_SCROLL_SENSITIVE or TYPE_SCROLL_INSENSITIVE), and one or more of the following is true.

  1. One or more of the columns in the SET clause is also used in the WHERE clause and the VTI ResultSet is sensitive. We do not defer updates when the ResultSet is TYPE_SCROLL_INSENSITIVE because it is not necessary.
  2. The where clause contains a subselect on a VTI from the same class as the target VTI. We do not look at the VTI parameters, just the VTI class name.

By default, deletes on a VTI are deferred in a similar situation: when the VTI ResultSet is scrollable (ResultSet.TYPE_SCROLL_SENSITIVE or TYPE_SCROLL_INSENSITIVE), and the where clause contains a subselect on a VTI from the same class as the target VTI. We do not look at the VTI parameters, just the VTI class name.

By default, inserts into a VTI are deferred when the same VTI class is used as both the source and target. It does not depend on the scrollability of the VTI ResultSet because inserts can be deferred without scrolling the ResultSet.

If these defaults are not appropriate then the class implementing the VTI should also implement this interface (org.apache.derby.vti.DeferModification).

(A read/write VTI is implemented by a class that implements the java.sql.PreparedStatement interface, often by extending the UpdatableVTITemplate interface. @see UpdatableVTITemplate).

Update and delete statement deferral is implemented by scrolling the VTI's ResultSet. Therefore, updates and deletes on a VTI are never deferred unless the VTI's ResultSets are scrollable, even if the DeferModification interface methods return true. Therefore for an update or delete to be deferred the VTI getResultSetType() method must return ResultSet.TYPE_SCROLL_SENSITIVE or TYPE_SCROLL_INSENSITIVE and the VTI must produce scrollable java.sql.ResultSets that implement the getRow() and absolute() methods. If your VTI is implemented as an extension to UpdatableVTITemplate then you must override the getResultSetMethod: UpdatableVTITemplate.getResultSetType() throws an exception. If your VTI's ResultSets are implemented as extensions to VTITemplate then you must override the getRow() and absolute() methods: VTITemplate.getRow() and absolute() throw exceptions.

This interface is not used when the VTI is referenced only in a subselect; it is only used when a VTI appears as the target of an INSERT, UPDATE, or DELETE statement.

Field Summary

Modifier and TypeField and Description
public static final int
public static final int
public static final int

Method Summary

Modifier and TypeMethod and Description
public boolean

Returns:

true if the statement type should always be deferred on this VTI, false other criteria (see below) should be examined to determine whether to defer the modification.
alwaysDefer
(int
One of INSERT_STATEMENT, UPDATE_STATEMENT, DELETE_STATEMENT.
statementType
)

This method is called during preparation of an insert, update, or delete statement with this VTI as the target.

public boolean

Returns:

true if the update must be deferred false if this column does not require a deferred update
columnRequiresDefer
(int
UPDATE_STATEMENT or DELETE_STATEMENT.
statementType
,
String
the name of one of the columns being updated
columnName
,
boolean
indicates whether the column also appears in the where clause
inWhereClause
)

This method is called during preparation of an update or delete statement on the virtual table if getResultSetType() returns ResultSet.TYPE_SCROLL_SENSITIVE or TYPE_SCROLL_SENSITIVE and alwaysDefer( statementType) returns false.

public void
modificationNotify(int
one of INSERT_STATEMENT, UPDATE_STATEMENT, or DELETE_STATEMENT
statementType
,
boolean
true if the modification will be deferred, false if not.
deferred
)

This VTI method is called by Derby when a VTI modification (insert, update, or delete) is executed.

public boolean

Returns:

true if the modification must be deferred false if this source table does not necessitate a deferred modification
subselectRequiresDefer
(int
the statement type: INSERT_STATEMENT, UPDATE_STATEMENT, or DELETE_STATEMENT.
statementType
,
String
the schema of the table in the sub-select.
schemaName
,
String
the name of the table in the sub-select.
tableName
)

This method is called during preparation of an insert, update, or delete statement that has this virtual table as its target and that has a sub-select.

public boolean

Returns:

true if the modification must be deferred false if this source table does not necessitate a deferred modification
subselectRequiresDefer
(int
the statement type: INSERT_STATEMENT, UPDATE_STATEMENT, or DELETE_STATEMENT.
statementType
,
String
the name of the class implementing the VTI in the sub-select.
VTIClassName
)

This method is called during preparation of an insert, update, or delete statement that has this virtual table as its target and that has a sub-select.

Field Detail

DELETE_STATEMENTback to summary
public static final int DELETE_STATEMENT
INSERT_STATEMENTback to summary
public static final int INSERT_STATEMENT
UPDATE_STATEMENTback to summary
public static final int UPDATE_STATEMENT

Method Detail

alwaysDeferback to summary
public boolean alwaysDefer(int statementType) throws SQLException

This method is called during preparation of an insert, update, or delete statement with this VTI as the target. It indicates whether the statement should be deferred irregardless of the other clauses in the statement. If alwaysDefer returns true then the other methods in this interface are not called. (At least not for this statement type).

Parameters
statementType:int

One of INSERT_STATEMENT, UPDATE_STATEMENT, DELETE_STATEMENT.

Returns:boolean

true if the statement type should always be deferred on this VTI, false other criteria (see below) should be examined to determine whether to defer the modification.

Exceptions
SQLException:
on an unexpected condition.
columnRequiresDeferback to summary
public boolean columnRequiresDefer(int statementType, String columnName, boolean inWhereClause) throws SQLException

This method is called during preparation of an update or delete statement on the virtual table if getResultSetType() returns ResultSet.TYPE_SCROLL_SENSITIVE or TYPE_SCROLL_SENSITIVE and alwaysDefer( statementType) returns false. ColumnRequiresDefer is called once for each column that is being updated, or each column in a DELETE where clause until it returns true or until all the columns have been exhausted.

Parameters
statementType:int

UPDATE_STATEMENT or DELETE_STATEMENT.

columnName:String

the name of one of the columns being updated

inWhereClause:boolean

indicates whether the column also appears in the where clause

Returns:boolean

true if the update must be deferred false if this column does not require a deferred update

Exceptions
SQLException:
a parameter is invalid or there is another unexpected failure.
modificationNotifyback to summary
public void modificationNotify(int statementType, boolean deferred) throws SQLException

This VTI method is called by Derby when a VTI modification (insert, update, or delete) is executed. It is called after the VTI has been instantiated but before any rows are read, inserted, updated, or deleted.

Parameters
statementType:int

one of INSERT_STATEMENT, UPDATE_STATEMENT, or DELETE_STATEMENT

deferred:boolean

true if the modification will be deferred, false if not.

Exceptions
SQLException:
thrown on an unexpected failure
subselectRequiresDeferback to summary
public boolean subselectRequiresDefer(int statementType, String schemaName, String tableName) throws SQLException

This method is called during preparation of an insert, update, or delete statement that has this virtual table as its target and that has a sub-select. It is invoked once for each regular table in a sub-select, if it has not already been determined that the statement should be deferred or that the VTI does not support deferral.

Parameters
statementType:int

the statement type: INSERT_STATEMENT, UPDATE_STATEMENT, or DELETE_STATEMENT.

schemaName:String

the schema of the table in the sub-select.

tableName:String

the name of the table in the sub-select.

Returns:boolean

true if the modification must be deferred false if this source table does not necessitate a deferred modification

Exceptions
SQLException:
a parameter is invalid or there is another unexpected failure.
subselectRequiresDeferback to summary
public boolean subselectRequiresDefer(int statementType, String VTIClassName) throws SQLException

This method is called during preparation of an insert, update, or delete statement that has this virtual table as its target and that has a sub-select. It is invoked once for each virtual table in the sub-select, if it has not already been determined that the statement should be deferred or that the VTI does not support deferral.

Parameters
statementType:int

the statement type: INSERT_STATEMENT, UPDATE_STATEMENT, or DELETE_STATEMENT.

VTIClassName:String

the name of the class implementing the VTI in the sub-select.

Returns:boolean

true if the modification must be deferred false if this source table does not necessitate a deferred modification

Exceptions
SQLException:
a parameter is invalid or there is another unexpected failure.