You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@empire-db.apache.org by do...@apache.org on 2018/03/05 11:56:10 UTC

empire-db git commit: EMPIREDB-274 Fixed syntax error with Oracle MERGE INTO update statement

Repository: empire-db
Updated Branches:
  refs/heads/master 665861e24 -> 24d87e7a7


EMPIREDB-274
Fixed syntax error with Oracle MERGE INTO update statement


Project: http://git-wip-us.apache.org/repos/asf/empire-db/repo
Commit: http://git-wip-us.apache.org/repos/asf/empire-db/commit/24d87e7a
Tree: http://git-wip-us.apache.org/repos/asf/empire-db/tree/24d87e7a
Diff: http://git-wip-us.apache.org/repos/asf/empire-db/diff/24d87e7a

Branch: refs/heads/master
Commit: 24d87e7a764a5691e44b2ac13a531d98ce761c57
Parents: 665861e
Author: Rainer Döbele <do...@apache.org>
Authored: Mon Mar 5 12:56:03 2018 +0100
Committer: Rainer Döbele <do...@apache.org>
Committed: Mon Mar 5 12:56:03 2018 +0100

----------------------------------------------------------------------
 .../empire/db/oracle/DBCommandOracle.java       | 40 ++++++++++++++++----
 1 file changed, 32 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/empire-db/blob/24d87e7a/empire-db/src/main/java/org/apache/empire/db/oracle/DBCommandOracle.java
----------------------------------------------------------------------
diff --git a/empire-db/src/main/java/org/apache/empire/db/oracle/DBCommandOracle.java b/empire-db/src/main/java/org/apache/empire/db/oracle/DBCommandOracle.java
index 01ad81b..de5eaa7 100644
--- a/empire-db/src/main/java/org/apache/empire/db/oracle/DBCommandOracle.java
+++ b/empire-db/src/main/java/org/apache/empire/db/oracle/DBCommandOracle.java
@@ -18,11 +18,14 @@
  */
 package org.apache.empire.db.oracle;
 
+import java.util.ArrayList;
 // Imports
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 import org.apache.empire.commons.StringUtils;
+import org.apache.empire.data.DataType;
 import org.apache.empire.db.DBColumn;
 import org.apache.empire.db.DBColumnExpr;
 import org.apache.empire.db.DBCommand;
@@ -30,6 +33,8 @@ import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.DBIndex;
 import org.apache.empire.db.DBRowSet;
 import org.apache.empire.db.DBTable;
+import org.apache.empire.db.expr.column.DBAliasExpr;
+import org.apache.empire.db.expr.column.DBValueExpr;
 import org.apache.empire.db.expr.compare.DBCompareExpr;
 import org.apache.empire.db.expr.join.DBColumnJoinExpr;
 import org.apache.empire.db.expr.join.DBJoinExpr;
@@ -312,23 +317,42 @@ public class DBCommandOracle extends DBCommand
             if (jcol.getRowSet()!=table)
                 inner.select(jcol);
         }
+        // find the source table
+        DBColumnExpr left  = updateJoin.getLeft();
+        DBColumnExpr right = updateJoin.getRight();
+        DBRowSet source = right.getUpdateColumn().getRowSet();
+        if (source==table)
+            source = left.getUpdateColumn().getRowSet();
+        // Add set expressions
+        String sourceAliasPrefix = source.getAlias()+".";
+        List<DBSetExpr> mergeSet = new ArrayList<DBSetExpr>(set.size());   
         for (DBSetExpr sex : set)
         {   // Select set expressions
             Object val = sex.getValue();
             if (val instanceof DBColumnExpr)
-                inner.select(((DBColumnExpr)val));
+            {
+                DBColumnExpr expr = ((DBColumnExpr)val);
+                if (!(expr instanceof DBColumn) && !(expr instanceof DBAliasExpr))
+                {   // rename column
+                    String name = "COL_"+String.valueOf(mergeSet.size());
+                    expr = expr.as(name);
+                }
+                // select
+                inner.select(expr);
+                // Name
+                DBValueExpr NAME_EXPR = getDatabase().getValueExpr(sourceAliasPrefix+expr.getName(), DataType.UNKNOWN);
+                mergeSet.add(sex.getColumn().to(NAME_EXPR));
+            }
+            else
+            {   // add original
+                mergeSet.add(sex);
+            }
         }
         // remove join (if not necessary)
         if (inner.hasConstraintOn(table)==false)
             inner.removeJoinsOn(table);
         // add SQL for inner statement
         inner.addSQL(buf, CTX_DEFAULT);
-        // find the source table
-        DBColumnExpr left  = updateJoin.getLeft();
-        DBColumnExpr right = updateJoin.getRight();
-        DBRowSet source = right.getUpdateColumn().getRowSet();
-        if (source==table)
-            source = left.getUpdateColumn().getRowSet();
         // add Alias
         buf.append(" ");
         buf.append(source.getAlias());
@@ -344,7 +368,7 @@ public class DBCommandOracle extends DBCommand
         // Set Expressions
         buf.append(")\r\nWHEN MATCHED THEN UPDATE ");
         buf.append("\r\nSET ");
-        addListExpr(buf, set, CTX_DEFAULT, ", ");
+        addListExpr(buf, mergeSet, CTX_DEFAULT, ", ");
         // done
         return buf.toString();
     }