I suspect there might be a jOOq bug.
I am using:
open jdk v11.0.9
h2 1.4.200
jooq 3.13.4
I have the following code:
val t1 = JTable1.TABLE1
val t2 = JTable2.TABLE2
val t3 = JTable2.TABLE3
val t4 = JTable2.TABLE4
val t5 = JTable2.TABLE5
val dateHourField = trunc(t2.RECORD_TIMESTAMP, DatePart.HOUR).`as`("date_hour")
val insert = db.insertInto(t1)
.columns(t1.COL1_ID, t1.COL2_ID, t1.COL3, t1.COL4, t1.COL5, t1.COL6_ID, t1.COL7)
.select(
select(t2.COL1_ID, t2.COL2_ID, sum(t2.COL3).cast(Long::class.java), sum(t2.COL4).cast(Long::class.java), dateHourField, t5.ID, COL7)
.from(t2)
.leftJoin(t3).on(t3.COL8.eq(t2.COL8).and(t3.COL9.eq(t2.COL9)))
.leftJoin(t4).on(t4.COL10_ID.eq(t3.ID))
.leftJoin(t5).on(t5.ID.eq(t4.COL6_ID))
.groupBy(dateHourField, t2.COL1_ID, t2.COL2_ID, t5.ID))
insert.onDuplicateKeyIgnore().execute()
When using h2, it produces the following erroneous SQL:
insert into PUBLIC.TABLE1 (
COL1_ID,
COL2_ID,
COL3,
COL4,
COL5,
COL6_ID,
COL7
)
select
T.COL1_ID,
T.COL2_ID,
T.COL3,
T.COL4,
T.COL5,
T.COL6_ID,
T.COL7
from (
select
null COL1_ID,
null COL2_ID,
null COL3,
null COL4,
null COL5,
null COL6_ID,
null COL7
where not exists (
select 1 ONE
from PUBLIC.TABLE1
where (
PUBLIC.TABLE1.COL5 = null
and PUBLIC.TABLE1.COL3 = null
and PUBLIC.TABLE1.COL6_ID = null
and PUBLIC.TABLE1.COL7 = null
and PUBLIC.TABLE1.COL1_ID = null
and PUBLIC.TABLE1.COL2_ID = null
and PUBLIC.TABLE1.COL4 = null
)
)
) T
But it works with postgres as expected:
insert into PUBLIC.TABLE1 (
COL1_ID,
COL2_ID,
COL3,
COL4,
COL5,
COL6_ID,
COL7
)
select
PUBLIC.TABLE2.COL1_ID,
PUBLIC.TABLE2.COL2_ID,
cast(sum(PUBLIC.TABLE2.COL3) as bigint),
cast(sum(PUBLIC.TABLE2.COL4) as bigint),
date_trunc('hour', PUBLIC.TABLE2.RECORD_TIMESTAMP) as DATE_HOUR,
'SomeRandomConstant'
from PUBLIC.TABLE2
left outer join PUBLIC.TABLE3
on (
PUBLIC.TABLE3.COL8 = PUBLIC.TABLE2.COL8
and PUBLIC.TABLE3.COL9 = PUBLIC.TABLE2.COL9
)
left outer join PUBLIC.TABLE4
left outer join PUBLIC.TABLE5
where (
(
PUBLIC.TABLE2.COL4 > 0
or PUBLIC.TABLE2.COL3 > 0
)
and PUBLIC.TABLE2.RECORD_TIMESTAMP > timestamp with time zone '2019-05-02 00:00:00+00:00'
and PUBLIC.TABLE2.RECORD_TIMESTAMP < timestamp with time zone '2019-05-05 00:00:00+00:00'
)
group by
COL5,
PUBLIC.TABLE2.COL1_ID,
PUBLIC.TABLE2.COL2_ID,
on conflict do nothing
Thanks!
Colin