[#2665] Added proper clause events for INSERT .. SELECT
This commit is contained in:
parent
094be3cdfb
commit
38f2ef3060
@ -35,6 +35,7 @@
|
||||
*/
|
||||
package org.jooq.impl;
|
||||
|
||||
import static org.jooq.Clause.FIELD_ROW;
|
||||
import static org.jooq.impl.Utils.visitAll;
|
||||
|
||||
import java.util.Collection;
|
||||
@ -55,7 +56,8 @@ class FieldMapForInsert extends AbstractQueryPartMap<Field<?>, Field<?>> {
|
||||
/**
|
||||
* Generated UID
|
||||
*/
|
||||
private static final long serialVersionUID = -2192833491610583485L;
|
||||
private static final long serialVersionUID = -2192833491610583485L;
|
||||
private static final Clause[] CLAUSES = { FIELD_ROW };
|
||||
|
||||
FieldMapForInsert() {
|
||||
}
|
||||
@ -63,30 +65,30 @@ class FieldMapForInsert extends AbstractQueryPartMap<Field<?>, Field<?>> {
|
||||
@Override
|
||||
public final void toSQL(RenderContext context) {
|
||||
boolean indent = (size() > 1);
|
||||
|
||||
|
||||
context.sql("(");
|
||||
|
||||
|
||||
if (indent) {
|
||||
context.formatIndentStart();
|
||||
}
|
||||
|
||||
|
||||
String separator = "";
|
||||
for (Field<?> field : values()) {
|
||||
context.sql(separator);
|
||||
|
||||
|
||||
if (indent) {
|
||||
context.formatNewLine();
|
||||
}
|
||||
|
||||
|
||||
context.visit(field);
|
||||
separator = ", ";
|
||||
}
|
||||
|
||||
|
||||
if (indent) {
|
||||
context.formatIndentEnd()
|
||||
.formatNewLine();
|
||||
}
|
||||
|
||||
|
||||
context.sql(")");
|
||||
}
|
||||
|
||||
@ -133,7 +135,7 @@ class FieldMapForInsert extends AbstractQueryPartMap<Field<?>, Field<?>> {
|
||||
|
||||
@Override
|
||||
public final Clause[] clauses(Context<?> ctx) {
|
||||
return null;
|
||||
return CLAUSES;
|
||||
}
|
||||
|
||||
final void putFields(Collection<? extends Field<?>> fields) {
|
||||
|
||||
@ -116,8 +116,6 @@ class FieldMapsForInsert extends AbstractQueryPart {
|
||||
}
|
||||
|
||||
private void toSQLInsertSelect(RenderContext context) {
|
||||
context.start(INSERT_SELECT);
|
||||
|
||||
Select<Record> select = null;
|
||||
for (FieldMapForInsert map : insertMaps) {
|
||||
if (map != null) {
|
||||
@ -133,7 +131,6 @@ class FieldMapsForInsert extends AbstractQueryPart {
|
||||
}
|
||||
|
||||
context.visit(select);
|
||||
context.end(INSERT_SELECT);
|
||||
}
|
||||
|
||||
private void toSQL92Values(RenderContext context) {
|
||||
|
||||
@ -36,6 +36,8 @@
|
||||
package org.jooq.impl;
|
||||
|
||||
import static org.jooq.Clause.INSERT;
|
||||
import static org.jooq.Clause.INSERT_INSERT_INTO;
|
||||
import static org.jooq.Clause.INSERT_SELECT;
|
||||
import static org.jooq.impl.Utils.visitAll;
|
||||
|
||||
import org.jooq.BindContext;
|
||||
@ -74,22 +76,31 @@ class InsertSelectQueryImpl<R extends Record> extends AbstractQuery implements I
|
||||
|
||||
@Override
|
||||
public final void toSQL(RenderContext context) {
|
||||
context.keyword("insert into")
|
||||
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)
|
||||
.literal(field.getName());
|
||||
.visit(field);
|
||||
|
||||
separator = ", ";
|
||||
}
|
||||
|
||||
context.qualify(qualify);
|
||||
context.sql(")")
|
||||
.end(INSERT_INSERT_INTO)
|
||||
.formatSeparator()
|
||||
.visit(select);
|
||||
.start(INSERT_SELECT)
|
||||
.visit(select)
|
||||
.end(INSERT_SELECT);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -60,6 +60,7 @@ import static org.jooq.Clause.FIELD_VALUE;
|
||||
import static org.jooq.Clause.INSERT;
|
||||
import static org.jooq.Clause.INSERT_INSERT_INTO;
|
||||
import static org.jooq.Clause.INSERT_RETURNING;
|
||||
import static org.jooq.Clause.INSERT_SELECT;
|
||||
import static org.jooq.Clause.INSERT_VALUES;
|
||||
import static org.jooq.Clause.SELECT;
|
||||
import static org.jooq.Clause.SELECT_CONNECT_BY;
|
||||
@ -69,6 +70,7 @@ import static org.jooq.Clause.SELECT_HAVING;
|
||||
import static org.jooq.Clause.SELECT_ORDER_BY;
|
||||
import static org.jooq.Clause.SELECT_SELECT;
|
||||
import static org.jooq.Clause.SELECT_START_WITH;
|
||||
import static org.jooq.Clause.SELECT_UNION_ALL;
|
||||
import static org.jooq.Clause.SELECT_WHERE;
|
||||
import static org.jooq.Clause.TABLE;
|
||||
import static org.jooq.Clause.TABLE_REFERENCE;
|
||||
@ -223,16 +225,152 @@ public class VisitContextTest extends AbstractTest {
|
||||
asList(INSERT, INSERT_INSERT_INTO, FIELD),
|
||||
asList(INSERT, INSERT_INSERT_INTO, FIELD, FIELD_REFERENCE),
|
||||
asList(INSERT, INSERT_VALUES),
|
||||
asList(INSERT, INSERT_VALUES, FIELD),
|
||||
asList(INSERT, INSERT_VALUES, FIELD, FIELD_VALUE),
|
||||
asList(INSERT, INSERT_VALUES, FIELD),
|
||||
asList(INSERT, INSERT_VALUES, FIELD, FIELD_VALUE),
|
||||
asList(INSERT, INSERT_VALUES, FIELD),
|
||||
asList(INSERT, INSERT_VALUES, FIELD, FIELD_VALUE),
|
||||
asList(INSERT, INSERT_VALUES, FIELD_ROW),
|
||||
asList(INSERT, INSERT_VALUES, FIELD_ROW, FIELD),
|
||||
asList(INSERT, INSERT_VALUES, FIELD_ROW, FIELD, FIELD_VALUE),
|
||||
asList(INSERT, INSERT_VALUES, FIELD_ROW, FIELD),
|
||||
asList(INSERT, INSERT_VALUES, FIELD_ROW, FIELD, FIELD_VALUE),
|
||||
asList(INSERT, INSERT_VALUES, FIELD_ROW, FIELD),
|
||||
asList(INSERT, INSERT_VALUES, FIELD_ROW, FIELD, FIELD_VALUE),
|
||||
asList(INSERT, INSERT_RETURNING)
|
||||
));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test_INSERT_VALUES_multiple() {
|
||||
|
||||
// Postgres has a native implementation for multi-value inserts
|
||||
ctx.configuration().set(POSTGRES);
|
||||
ctx.insertInto(TABLE1)
|
||||
.values(1, "value", null)
|
||||
.values(2, "value", null)
|
||||
.getSQL();
|
||||
|
||||
assertEvents(asList(
|
||||
asList(INSERT),
|
||||
asList(INSERT, INSERT_INSERT_INTO),
|
||||
asList(INSERT, INSERT_INSERT_INTO, TABLE),
|
||||
asList(INSERT, INSERT_INSERT_INTO, TABLE, TABLE_REFERENCE),
|
||||
asList(INSERT, INSERT_INSERT_INTO, FIELD),
|
||||
asList(INSERT, INSERT_INSERT_INTO, FIELD, FIELD_REFERENCE),
|
||||
asList(INSERT, INSERT_INSERT_INTO, FIELD),
|
||||
asList(INSERT, INSERT_INSERT_INTO, FIELD, FIELD_REFERENCE),
|
||||
asList(INSERT, INSERT_INSERT_INTO, FIELD),
|
||||
asList(INSERT, INSERT_INSERT_INTO, FIELD, FIELD_REFERENCE),
|
||||
asList(INSERT, INSERT_VALUES),
|
||||
asList(INSERT, INSERT_VALUES, FIELD_ROW),
|
||||
asList(INSERT, INSERT_VALUES, FIELD_ROW, FIELD),
|
||||
asList(INSERT, INSERT_VALUES, FIELD_ROW, FIELD, FIELD_VALUE),
|
||||
asList(INSERT, INSERT_VALUES, FIELD_ROW, FIELD),
|
||||
asList(INSERT, INSERT_VALUES, FIELD_ROW, FIELD, FIELD_VALUE),
|
||||
asList(INSERT, INSERT_VALUES, FIELD_ROW, FIELD),
|
||||
asList(INSERT, INSERT_VALUES, FIELD_ROW, FIELD, FIELD_VALUE),
|
||||
asList(INSERT, INSERT_VALUES, FIELD_ROW),
|
||||
asList(INSERT, INSERT_VALUES, FIELD_ROW, FIELD),
|
||||
asList(INSERT, INSERT_VALUES, FIELD_ROW, FIELD, FIELD_VALUE),
|
||||
asList(INSERT, INSERT_VALUES, FIELD_ROW, FIELD),
|
||||
asList(INSERT, INSERT_VALUES, FIELD_ROW, FIELD, FIELD_VALUE),
|
||||
asList(INSERT, INSERT_VALUES, FIELD_ROW, FIELD),
|
||||
asList(INSERT, INSERT_VALUES, FIELD_ROW, FIELD, FIELD_VALUE),
|
||||
asList(INSERT, INSERT_RETURNING)
|
||||
));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test_INSERT_VALUES_multiple_emulated() {
|
||||
|
||||
// Oracle emulates multi-record inserts through INSERT .. SELECT
|
||||
ctx.insertInto(TABLE1)
|
||||
.values(1, "value", null)
|
||||
.values(2, "value", null)
|
||||
.getSQL();
|
||||
|
||||
assertEvents(asList(
|
||||
asList(INSERT),
|
||||
asList(INSERT, INSERT_INSERT_INTO),
|
||||
asList(INSERT, INSERT_INSERT_INTO, TABLE),
|
||||
asList(INSERT, INSERT_INSERT_INTO, TABLE, TABLE_REFERENCE),
|
||||
asList(INSERT, INSERT_INSERT_INTO, FIELD),
|
||||
asList(INSERT, INSERT_INSERT_INTO, FIELD, FIELD_REFERENCE),
|
||||
asList(INSERT, INSERT_INSERT_INTO, FIELD),
|
||||
asList(INSERT, INSERT_INSERT_INTO, FIELD, FIELD_REFERENCE),
|
||||
asList(INSERT, INSERT_INSERT_INTO, FIELD),
|
||||
asList(INSERT, INSERT_INSERT_INTO, FIELD, FIELD_REFERENCE),
|
||||
asList(INSERT, INSERT_SELECT),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_SELECT),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_SELECT, FIELD),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_SELECT, FIELD, FIELD_VALUE),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_SELECT, FIELD),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_SELECT, FIELD, FIELD_VALUE),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_SELECT, FIELD),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_SELECT, FIELD, FIELD_VALUE),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_FROM),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_FROM, TABLE),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_WHERE),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_START_WITH),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_CONNECT_BY),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_GROUP_BY),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_HAVING),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_ORDER_BY),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_SELECT),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_SELECT, FIELD),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_SELECT, FIELD, FIELD_VALUE),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_SELECT, FIELD),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_SELECT, FIELD, FIELD_VALUE),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_SELECT, FIELD),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_SELECT, FIELD, FIELD_VALUE),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_FROM),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_FROM, TABLE),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_WHERE),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_START_WITH),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_CONNECT_BY),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_GROUP_BY),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_HAVING),
|
||||
asList(INSERT, INSERT_SELECT, SELECT_UNION_ALL, SELECT, SELECT_ORDER_BY),
|
||||
asList(INSERT, INSERT_RETURNING)
|
||||
));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test_INSERT_SELECT() {
|
||||
ctx.insertInto(TABLE1)
|
||||
.select(select(val(1), val("value"), val(null)))
|
||||
.getSQL();
|
||||
|
||||
assertEvents(asList(
|
||||
asList(INSERT),
|
||||
asList(INSERT, INSERT_INSERT_INTO),
|
||||
asList(INSERT, INSERT_INSERT_INTO, TABLE),
|
||||
asList(INSERT, INSERT_INSERT_INTO, TABLE, TABLE_REFERENCE),
|
||||
asList(INSERT, INSERT_INSERT_INTO, FIELD),
|
||||
asList(INSERT, INSERT_INSERT_INTO, FIELD, FIELD_REFERENCE),
|
||||
asList(INSERT, INSERT_INSERT_INTO, FIELD),
|
||||
asList(INSERT, INSERT_INSERT_INTO, FIELD, FIELD_REFERENCE),
|
||||
asList(INSERT, INSERT_INSERT_INTO, FIELD),
|
||||
asList(INSERT, INSERT_INSERT_INTO, FIELD, FIELD_REFERENCE),
|
||||
asList(INSERT, INSERT_SELECT),
|
||||
asList(INSERT, INSERT_SELECT, SELECT),
|
||||
asList(INSERT, INSERT_SELECT, SELECT, SELECT_SELECT),
|
||||
asList(INSERT, INSERT_SELECT, SELECT, SELECT_SELECT, FIELD),
|
||||
asList(INSERT, INSERT_SELECT, SELECT, SELECT_SELECT, FIELD, FIELD_VALUE),
|
||||
asList(INSERT, INSERT_SELECT, SELECT, SELECT_SELECT, FIELD),
|
||||
asList(INSERT, INSERT_SELECT, SELECT, SELECT_SELECT, FIELD, FIELD_VALUE),
|
||||
asList(INSERT, INSERT_SELECT, SELECT, SELECT_SELECT, FIELD),
|
||||
asList(INSERT, INSERT_SELECT, SELECT, SELECT_SELECT, FIELD, FIELD_VALUE),
|
||||
asList(INSERT, INSERT_SELECT, SELECT, SELECT_FROM),
|
||||
asList(INSERT, INSERT_SELECT, SELECT, SELECT_FROM, TABLE),
|
||||
asList(INSERT, INSERT_SELECT, SELECT, SELECT_WHERE),
|
||||
asList(INSERT, INSERT_SELECT, SELECT, SELECT_START_WITH),
|
||||
asList(INSERT, INSERT_SELECT, SELECT, SELECT_CONNECT_BY),
|
||||
asList(INSERT, INSERT_SELECT, SELECT, SELECT_GROUP_BY),
|
||||
asList(INSERT, INSERT_SELECT, SELECT, SELECT_HAVING),
|
||||
asList(INSERT, INSERT_SELECT, SELECT, SELECT_ORDER_BY)
|
||||
));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test_UPDATE_SET_simple() {
|
||||
ctx.update(TABLE1)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user