You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-dev@db.apache.org by "Knut Anders Hatlen (JIRA)" <ji...@apache.org> on 2014/01/13 13:44:06 UTC

[jira] [Commented] (DERBY-3155) Support for SQL:2003 MERGE statement

    [ https://issues.apache.org/jira/browse/DERBY-3155?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13869457#comment-13869457 ] 

Knut Anders Hatlen commented on DERBY-3155:
-------------------------------------------

Hi Rick,

I got a NullPointerException from a MERGE statement on trunk:

{noformat}
ij version 10.11
ij> connect 'jdbc:derby:memory:db;create=true';
ij> create table t1 (x int, y int);
0 rows inserted/updated/deleted
ij> create table t2 (x int);
0 rows inserted/updated/deleted
ij> merge into t1 using t2 on t1.x = t2.x when matched then update set y = -y when not matched then insert values (t2.x, 42);
ERROR XJ001: Java exception: ': java.lang.NullPointerException'.
java.lang.NullPointerException
	at org.apache.derby.impl.sql.compile.MatchingClauseNode.bindInsertValues(MatchingClauseNode.java:783)
	at org.apache.derby.impl.sql.compile.MatchingClauseNode.bindInsert(MatchingClauseNode.java:738)
	at org.apache.derby.impl.sql.compile.MatchingClauseNode.bind(MatchingClauseNode.java:224)
	at org.apache.derby.impl.sql.compile.MergeNode.bindStatement(MergeNode.java:258)
	at org.apache.derby.impl.sql.GenericStatement.prepMinion(GenericStatement.java:402)
	at org.apache.derby.impl.sql.GenericStatement.prepare(GenericStatement.java:99)
	at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(GenericLanguageConnectionContext.java:1116)
	at org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:682)
	at org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:631)
	at org.apache.derby.impl.tools.ij.ij.executeImmediate(ij.java:367)
	at org.apache.derby.impl.tools.ij.utilMain.doCatch(utilMain.java:527)
	at org.apache.derby.impl.tools.ij.utilMain.runScriptGuts(utilMain.java:369)
	at org.apache.derby.impl.tools.ij.utilMain.go(utilMain.java:245)
	at org.apache.derby.impl.tools.ij.Main.go(Main.java:229)
	at org.apache.derby.impl.tools.ij.Main.mainCore(Main.java:184)
	at org.apache.derby.impl.tools.ij.Main.main(Main.java:75)
	at org.apache.derby.tools.ij.main(ij.java:59)
{noformat}

> 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, derby-3155-09-aa-correlationNames.diff, derby-3155-10-aa-correlationNames.diff, derby-3155-11-ab-beforeTriggersCantFireMerge.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.5#6160)