in holo-client/src/main/java/com/alibaba/hologres/client/impl/UpsertStatementBuilder.java [156:243]
private SqlTemplate buildInsertSql(Tuple4<TableSchema, TableName, WriteMode, CheckAndPutCondition> tuple, Tuple<BitSet, BitSet> input) {
TableSchema schema = tuple.f0;
TableName tableName = tuple.f1;
WriteMode mode = tuple.f2;
CheckAndPutCondition checkAndPutCondition = tuple.f3;
BitSet set = input.l;
BitSet onlyInsertSet = input.r;
StringBuilder sb = new StringBuilder();
sb.append("insert into ").append(tableName.getFullName());
// 无论是与表中已有数据还是常量比较,都需要as重命名为old
if (checkAndPutCondition != null) {
sb.append(" as old ");
}
sb.append("(");
first = true;
set.stream().forEach((index) -> {
if (!first) {
sb.append(",");
}
first = false;
sb.append(IdentifierUtil.quoteIdentifier(schema.getColumn(index).getName(), true));
});
sb.append(")");
sb.append(" values ");
String header = sb.toString();
sb.setLength(0);
sb.append("(");
first = true;
set.stream().forEach((index) -> {
if (!first) {
sb.append(",");
}
first = false;
sb.append("?");
Column column = schema.getColumn(index);
if (Types.BIT == column.getType() && "bit".equals(column.getTypeName())) {
sb.append("::bit(").append(column.getPrecision()).append(")");
} else if (Types.OTHER == column.getType() && "varbit".equals(column.getTypeName())) {
sb.append("::bit varying(").append(column.getPrecision()).append(")");
}
});
sb.append(")");
String rowText = sb.toString();
sb.setLength(0);
if (schema.getKeyIndex().length > 0) {
sb.append(" on conflict (");
first = true;
for (int index : schema.getKeyIndex()) {
if (!first) {
sb.append(",");
}
first = false;
sb.append(IdentifierUtil.quoteIdentifier(schema.getColumnSchema()[index].getName(), true));
}
sb.append(") do ");
if (WriteMode.INSERT_OR_IGNORE == mode) {
sb.append("nothing");
} else {
sb.append("update set ");
first = true;
set.stream().forEach((index) -> {
if (!onlyInsertSet.get(index)) {
if (!first) {
sb.append(",");
}
first = false;
String columnName = IdentifierUtil.quoteIdentifier(schema.getColumnSchema()[index].getName(), true);
sb.append(columnName).append("=excluded.").append(columnName);
}
});
}
if (checkAndPutCondition != null) {
sb.append(" where");
sb.append(buildCheckAndPutPattern(checkAndPutCondition));
}
}
String tail = sb.toString();
int maxLevel = 32 - Integer.numberOfLeadingZeros(Short.MAX_VALUE / set.cardinality()) - 1;
SqlTemplate sqlTemplate = new SqlTemplate(header, tail, rowText, DELIMITER_DOT, maxLevel);
LOGGER.debug("new sql:{}", sqlTemplate.getSql(0));
return sqlTemplate;
}