From 87f622c1d528bb9dbb93877ff3e7f19bfe5f08ea Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 26 Mar 2024 13:22:33 +0100 Subject: [PATCH] [jOOQ/jOOQ#15732] Support ON CONFLICT .. ON CONSTRAINT --- .../java/org/jooq/impl/InsertQueryImpl.java | 35 ++++++++----------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java index d90e1511f3..5539b4c642 100644 --- a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java @@ -182,6 +182,7 @@ implements static final Set NO_SUPPORT_SUBQUERY_IN_MERGE_USING = SQLDialect.supportedBy(DERBY); static final Set REQUIRE_NEW_MYSQL_EXCLUDED_EMULATION = SQLDialect.supportedBy(MYSQL); static final Set NO_SUPPORT_INSERT_ALIASED_TABLE = SQLDialect.supportedBy(DERBY, DUCKDB, FIREBIRD, H2, MARIADB, MYSQL, TRINO); + static final Set NO_SUPPORT_ON_CONSTRAINT_ON_CONFLICT = SQLDialect.supportedBy(DUCKDB); final FieldMapsForInsert insertMaps; Select select; @@ -471,7 +472,7 @@ implements .visit(K_ON_CONFLICT) .sql(' '); - if (onConstraint != null ) { + if (onConstraint != null && !NO_SUPPORT_ON_CONSTRAINT_ON_CONFLICT.contains(ctx.dialect())) { ctx.data(DATA_CONSTRAINT_REFERENCE, true); ctx.visit(K_ON_CONSTRAINT) .sql(' ') @@ -483,15 +484,11 @@ implements if (onConflict != null && onConflict.size() > 0) ctx.sql('(').visit(onConflict).sql(')'); - - - - - - - - - + else if (onConstraint != null && NO_SUPPORT_ON_CONSTRAINT_ON_CONFLICT.contains(ctx.dialect())) + if (onConstraintUniqueKey != null) + ctx.sql('(').qualify(false, c -> c.visit(new FieldsImpl<>(onConstraintUniqueKey.getFields()))).sql(')'); + else + ctx.sql("[unknown unique key]"); // [#13273] SQLite 3.38 has started supporting optional on conflict targets else if (SUPPORTS_OPTIONAL_DO_UPDATE_CONFLICT_TARGETS.contains(ctx.dialect()) && !onConflictWhere.hasWhere()) @@ -654,7 +651,7 @@ implements .start(INSERT_ON_DUPLICATE_KEY_UPDATE) .visit(K_ON_CONFLICT); - if (onConstraint != null ) { + if (onConstraint != null && !NO_SUPPORT_ON_CONSTRAINT_ON_CONFLICT.contains(ctx.dialect())) { ctx.data(DATA_CONSTRAINT_REFERENCE, true, c -> c .sql(' ') .visit(K_ON_CONSTRAINT) @@ -668,16 +665,12 @@ implements acceptOnConflictWhere(ctx); } - - - - - - - - - - + else if (onConstraint != null && NO_SUPPORT_ON_CONSTRAINT_ON_CONFLICT.contains(ctx.dialect())) { + if (onConstraintUniqueKey != null) + ctx.sql(" (").qualify(false, c -> c.visit(new FieldsImpl<>(onConstraintUniqueKey.getFields()))).sql(')'); + else + ctx.sql(" [ unknown unique key ]"); + } } ctx.formatSeparator()