[ 
https://issues.apache.org/jira/browse/DERBY-3155?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Rick Hillegas updated DERBY-3155:
---------------------------------

    Attachment: derby-3155-08-ah-updateAction.diff

Attaching derby-3155-08-ah-updateAction.diff. This patch adds basic support for 
the UPDATE action of MERGE statements. I am running tests now.

This patch includes tests to stress simple examples of the following scenarios:

1) Target tables with identity, generated, and default columns.

2) Target tables with before/after row/statement UPDATE triggers.

3) Target tables with primary, foreign, and check constraints.

4) Source tables which are the OLD and NEW transition tables of triggers.

5) MERGE statements combining all three kinds of actions: INSERT, UPDATE, and 
DELETE.

When setting an identity column to the literal DEFAULT value, the UPDATE action 
of a MERGE statement behaves in the same incorrect way as an ordinary UPDATE 
statement. This behavior should be corrected when we fix DERBY-6414.


Touches the following files:

---------------------

M       java/engine/org/apache/derby/impl/sql/compile/MergeNode.java
M       java/engine/org/apache/derby/impl/sql/compile/MatchingClauseNode.java

Bulk of the compile-time changes needed to support UPDATE actions.

---------------------

M       java/engine/org/apache/derby/impl/sql/compile/UpdateNode.java

Changes to distinguish MERGE actions from UPDATEs driven by VTIs. It seems that 
trigger transition tables are modelled as VTIs when they drive UPDATEs.

---------------------

M       java/engine/org/apache/derby/impl/sql/compile/FromList.java
M       java/engine/org/apache/derby/impl/sql/compile/FromBaseTable.java

The binding of column references now involves poking the table name into the 
reference. Later on, this makes it possible to associate bound columns with 
their base tables when code-generating the temporary rows which are buffered up 
for UPDATE actions.

---------------------

M       java/engine/org/apache/derby/impl/sql/compile/DMLModStatementNode.java

Up until now, it has not been necessary to optimize the dummy SELECT which is 
cooked up while compiling INSERT/DELETE actions. However, we need to 
pre-process that SELECT for UPDATE actions. That is because an important 
re-mapping of column references happens during pre-processing. That re-mapping 
is needed in order to correctly code-generate CHECK constraints.

---------------------

M       java/engine/org/apache/derby/impl/sql/execute/DMLVTIResultSet.java
M       java/engine/org/apache/derby/impl/sql/execute/InsertResultSet.java
M       java/engine/org/apache/derby/impl/sql/execute/DMLWriteResultSet.java
M       java/engine/org/apache/derby/impl/sql/execute/DeleteResultSet.java

The ResultDescription field, common across all of the leaf DML classes, has 
been pulled up into their common superclass. This makes it possible to pull 
some normalization logic up into the superclass for sharing between the INSERT 
and UPDATE actions of MERGE statements.

---------------------

M       java/engine/org/apache/derby/impl/sql/execute/UpdateResultSet.java

Normalize the rows of UPDATE actions in order to enforce storability 
restrictions.

---------------------

M       java/engine/org/apache/derby/impl/store/access/heap/HeapRowLocation.java

The RowLocations returned by the driving left join now implement RefDataValue. 
This eliminates a ClassCastException at run time.

---------------------

M       
java/testing/org/apache/derbyTesting/functionTests/tests/lang/MergeStatementTest.java

New tests for the new functionality.


> Support for SQL:2003 MERGE statement
> ------------------------------------
>
>                 Key: DERBY-3155
>                 URL: https://issues.apache.org/jira/browse/DERBY-3155
>             Project: Derby
>          Issue Type: Improvement
>          Components: SQL
>            Reporter: Trejkaz
>            Assignee: Rick Hillegas
>              Labels: derby_triage10_10
>         Attachments: MergeStatement.html, MergeStatement.html, 
> MergeStatement.html, derby-3155-01-ac-grammar.diff, 
> derby-3155-02-ag-fixParserWarning.diff, 
> derby-3155-03-ae-backingStoreHashtableWithRowLocation.diff, 
> derby-3155-03-af-backingStoreHashtableWithRowLocation.diff, 
> derby-3155-03-ag-backingStoreHashtableWithRowLocation.diff, 
> derby-3155-03-ah-backingStoreHashtableWithRowLocation.diff, 
> derby-3155-04-ae-deleteAction.diff, derby-3155-04-af-deleteAction.diff, 
> derby-3155-05-aa-triggerTransitionTableAsTarget.diff, 
> derby-3155-06-aa-triggerTransitionTableAsSource.diff, 
> derby-3155-07-ad-insertAction.diff, derby-3155-08-ah-updateAction.diff
>
>
> A relatively common piece of logic in a database application is to check for 
> a row's existence and then either update or insert depending on its existence.
> SQL:2003 added a MERGE statement to perform this operation.  It looks like 
> this:
>     MERGE INTO table_name USING table_name ON (condition)
>     WHEN MATCHED THEN UPDATE SET column1 = value1 [, column2 = value2 ...]
>     WHEN NOT MATCHED THEN INSERT column1 [, column2 ...] VALUES (value1 [, 
> value2 ...]) 
> At the moment, the only workaround for this would be to write a stored 
> procedure to do the same operation, or to implement the logic client-side.



--
This message was sent by Atlassian JIRA
(v6.1#6144)

Reply via email to