in empire-db/src/main/java/org/apache/empire/dbms/hsql/DBCommandHSql.java [94:159]
protected void addUpdateWithJoins(DBSQLBuilder sql, DBRowSet table)
{
// The update table
DBColumn[] keyColumns = table.getKeyColumns();
if (keyColumns==null || keyColumns.length==0)
throw new NoPrimaryKeyException(table);
// Generate Merge expression
sql.reset(0);
sql.append("MERGE INTO ");
table.addSQL(sql, CTX_FULLNAME|CTX_ALIAS);
// Using
sql.append("\r\nUSING (");
// Add set expressions
List<DBColumnExpr> using = new ArrayList<DBColumnExpr>();
// Add key columns
for (DBColumn col : keyColumns)
using.add(col);
// Select Set-Expressions
List<DBSetExpr> mergeSet = new ArrayList<DBSetExpr>(set.size());
for (DBSetExpr sex : set)
{ // Select set expressions
Object val = sex.getValue();
if (val instanceof DBColumnExpr)
{
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
using.add(expr);
// Name
DBValueExpr NAME_EXPR = getDatabase().getValueExpr("q0."+expr.getName(), DataType.UNKNOWN);
mergeSet.add(sex.getColumn().to(NAME_EXPR));
}
else
{ // add original
mergeSet.add(sex);
}
}
// Add select
sql.append("SELECT ");
addListExpr(sql, using, CTX_ALL, ", ");
// From clause
addFrom(sql);
// Add Where
addWhere(sql);
// Add Grouping
addGrouping(sql);
// on
sql.append(") q0\r\nON (");
for (DBColumn col : keyColumns)
{ // compare
sql.append(" q0.");
col.addSQL(sql, CTX_NAME);
sql.append("=");
sql.append(table.getAlias());
sql.append(".");
col.addSQL(sql, CTX_NAME);
}
// Set Expressions
sql.append(")\r\nWHEN MATCHED THEN UPDATE ");
sql.append("\r\nSET ");
addListExpr(sql, mergeSet, CTX_DEFAULT, ", ");
}