TableLike<?> values(DSLContext ctx, RowN[] rows, String tableName, String... fieldNames) { switch (sqlDialect.family()) { case H2: List<SelectField<?>> fields = Lists.newArrayListWithCapacity(fieldNames.length); for (int i = 1; i <= fieldNames.length; i++) { fields.add(DSL.field("C" + i).as(fieldNames[i-1])); } RenderContext context = ctx.renderContext(); context.start(TABLE_VALUES) .keyword("values") .formatIndentLockStart(); boolean firstRow = true; for (Row row : rows) { if (!firstRow) { context.sql(',').formatSeparator(); } context.sql(row.toString()); firstRow = false; } context.formatIndentLockEnd() .end(TABLE_VALUES); String valuesClause = context.render(); return ctx.select(fields).from(valuesClause).asTable(tableName); default: return DSL.values(rows).as(tableName, fieldNames); } }
@Override public final void toSQL(RenderContext context) { context.start(INSERT_INSERT_INTO) .keyword("insert into") .sql(" ") .visit(into) .sql(" ("); // [#989] Avoid qualifying fields in INSERT field declaration boolean qualify = context.qualify(); context.qualify(false); String separator = ""; for (Field<?> field : fields) { context.sql(separator) .visit(field); separator = ", "; } context.qualify(qualify); context.sql(")") .end(INSERT_INSERT_INTO) .formatSeparator() .start(INSERT_SELECT) .visit(select) .end(INSERT_SELECT) .start(INSERT_ON_DUPLICATE_KEY_UPDATE) .end(INSERT_ON_DUPLICATE_KEY_UPDATE) .start(INSERT_RETURNING) .end(INSERT_RETURNING); }
@Override public final void toSQL(RenderContext context) { if (size() > 0) { String separator = ""; // [#989] Some dialects do not support qualified column references // in the UPDATE statement's SET clause // [#2055] Other dialects require qualified column references to // disambiguated columns in queries like // UPDATE t1 JOIN t2 .. SET t1.val = ..., t2.val = ... boolean restoreQualify = context.qualify(); boolean supportsQualify = asList(POSTGRES, SQLITE).contains(context.configuration().dialect()) ? false : restoreQualify; for (Entry<Field<?>, Field<?>> entry : entrySet()) { context.sql(separator); if (!"".equals(separator)) { context.formatNewLine(); } context.start(assignmentClause) .qualify(supportsQualify) .visit(entry.getKey()) .qualify(restoreQualify) .sql(" = ") .visit(entry.getValue()) .end(assignmentClause); separator = ", "; } } else { context.sql("[ no fields are updated ]"); } }
private final void toSQLStandard(RenderContext context) { context.start(MERGE_MERGE_INTO) .keyword("merge into").sql(" ") .declareTables(true) .end(MERGE_MERGE_INTO) .formatSeparator() .start(MERGE_USING) .declareTables(true) .keyword("using").sql(" ") context.end(MERGE_USING) .formatSeparator() .start(MERGE_ON) .sql(onParentheses ? ")" : "") .end(MERGE_ON) .start(MERGE_WHEN_MATCHED_THEN_UPDATE) .start(MERGE_SET); .start(MERGE_WHERE); .start(MERGE_DELETE_WHERE); .start(MERGE_WHEN_NOT_MATCHED_THEN_INSERT); notMatchedInsert.toSQLReferenceKeys(context); context.formatSeparator() .start(MERGE_VALUES) .keyword("values").sql(" ")
@Override public final void toSQL(RenderContext context) { boolean declare = context.declareTables(); context.start(DELETE_DELETE) .keyword("delete").sql(" "); // [#2464] MySQL supports a peculiar multi-table DELETE syntax for aliased tables: // DELETE t1 FROM my_table AS t1 if (asList(MARIADB, MYSQL).contains(context.configuration().dialect())) { // [#2579] TODO: Improve Table API to discover aliased tables more // reliably instead of resorting to instanceof: if (getFrom() instanceof TableAlias || (getFrom() instanceof TableImpl && ((TableImpl<R>)getFrom()).getAliasedTable() != null)) { context.visit(getFrom()) .sql(" "); } } context.keyword("from").sql(" ") .declareTables(true) .visit(getFrom()) .declareTables(declare) .end(DELETE_DELETE) .start(DELETE_WHERE); if (!(getWhere() instanceof TrueCondition)) { context.formatSeparator() .keyword("where").sql(" ") .visit(getWhere()); } context.end(DELETE_WHERE); }
@Override public final void toSQL(RenderContext context) { context.start(UPDATE_UPDATE) .keyword("update") .sql(" ") .start(UPDATE_SET) .keyword("set") .sql(" "); boolean qualify = context.qualify(); context.start(UPDATE_SET_ASSIGNMENT) .qualify(false) .visit(multiRow) context.start(UPDATE_FROM); context.start(UPDATE_WHERE); .start(UPDATE_RETURNING);
private final void toSQLInsert(RenderContext context) { context.start(INSERT_INSERT_INTO) .keyword("insert") .sql(" ")
toSQLInsert(context); context.formatSeparator() .start(INSERT_ON_DUPLICATE_KEY_UPDATE) .keyword("on duplicate key update") .sql(" ") case MYSQL: { toSQLInsert(context); context.start(INSERT_ON_DUPLICATE_KEY_UPDATE) .end(INSERT_ON_DUPLICATE_KEY_UPDATE); break; .start(INSERT_ON_DUPLICATE_KEY_UPDATE) .keyword("on duplicate key update") .sql(" ") context.start(INSERT_ON_DUPLICATE_KEY_UPDATE) .end(INSERT_ON_DUPLICATE_KEY_UPDATE); context.start(INSERT_RETURNING); toSQLReturning(context); context.end(INSERT_RETURNING);
context.start(TRUNCATE_TRUNCATE) .keyword("truncate table").sql(" ") .visit(table);
context.start(SELECT_SELECT) .keyword("select") .sql(" "); context.start(SELECT_FROM) .declareTables(true); context.start(SELECT_WHERE); context.start(SELECT_START_WITH); context.start(SELECT_CONNECT_BY); context.start(SELECT_GROUP_BY); context.start(SELECT_HAVING); context.start(SELECT_WINDOW); context.start(SELECT_ORDER_BY);
context.start(TABLE_VALUES) .keyword("values") .formatIndentLockStart();