diff --git a/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java b/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java index 14f31c6e4f..ed266b9151 100644 --- a/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java +++ b/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java @@ -4950,6 +4950,39 @@ public abstract class jOOQAbstractTest< (record.getValue(tomorrow).getTime() / 1000 - record.getValue(ts).getTime() / 1000)); } + @Test + public void testExtractInSubselect() throws Exception { + Field now = create().currentTimestamp(); + + Field year = now.extract(DatePart.YEAR).as("y"); + Field month = now.extract(DatePart.MONTH).as("m"); + Field day = now.extract(DatePart.DAY).as("d"); + + Select sub = create().select(year, month, day); + Table subTable = sub.asTable("subselect"); + + Record reference = sub.fetchOne(); + Record result; + + result = create().select().from(sub).fetchOne(); + assertEquals(reference, result); + + result = create().select().from(subTable).fetchOne(); + assertEquals(reference, result); + + result = create().select( + sub.getField("y"), + sub.getField("m"), + sub.getField("d")).from(sub).fetchOne(); + assertEquals(reference, result); + + result = create().select( + subTable.getField("y"), + subTable.getField("m"), + subTable.getField("d")).from(subTable).fetchOne(); + assertEquals(reference, result); + } + @Test public void testFunctionsOnNumbers() throws Exception { diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractSelect.java b/jOOQ/src/main/java/org/jooq/impl/AbstractSelect.java index 3c7d097bb6..a309724288 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractSelect.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractSelect.java @@ -122,16 +122,14 @@ abstract class AbstractSelect extends AbstractResultQuery i @Override public final Table asTable() { - Table table = new SelectQueryAsTable(this); - // Its usually better to alias nested selects that are used in // the FROM clause of a query - return table.as("alias_" + Math.abs(table.hashCode())); + return new SelectQueryAsTable(this).as("alias_" + Math.abs(hashCode())); } @Override public final Table asTable(String alias) { - return asTable().as(alias); + return new SelectQueryAsTable(this).as(alias); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/Extract.java b/jOOQ/src/main/java/org/jooq/impl/Extract.java index fc855b4060..f51ec98839 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Extract.java +++ b/jOOQ/src/main/java/org/jooq/impl/Extract.java @@ -67,13 +67,6 @@ class Extract extends AbstractFunction { @Override final Field getFunction0(Configuration configuration) { switch (configuration.getDialect()) { - case INGRES: // No break - case MYSQL: // No break - case POSTGRES: // No break - case HSQLDB: // No break - case H2: - return new SQLExtract(); - case SQLITE: switch (datePart) { case YEAR: @@ -149,8 +142,15 @@ class Extract extends AbstractFunction { throw new SQLDialectNotSupportedException("DatePart not supported: " + datePart); } + case INGRES: // No break + case MYSQL: // No break + case POSTGRES: // No break + case HSQLDB: // No break + case H2: + + // A default implementation is necessary for hashCode() and toString() default: - throw new SQLDialectNotSupportedException("extract not supported"); + return new SQLExtract(); } }