diff --git a/jOOQ-test/src/org/jooq/test/_/testcases/ExoticTests.java b/jOOQ-test/src/org/jooq/test/_/testcases/ExoticTests.java index cfa0f1f8b0..9b41c0a9bc 100644 --- a/jOOQ-test/src/org/jooq/test/_/testcases/ExoticTests.java +++ b/jOOQ-test/src/org/jooq/test/_/testcases/ExoticTests.java @@ -43,9 +43,21 @@ import static org.jooq.impl.Factory.count; import static org.jooq.impl.Factory.field; import static org.jooq.impl.Factory.literal; import static org.jooq.impl.Factory.max; +import static org.jooq.impl.Factory.one; +import static org.jooq.impl.Factory.substring; import static org.jooq.impl.Factory.sum; import static org.jooq.impl.Factory.table; +import static org.jooq.impl.Factory.trueCondition; import static org.jooq.impl.Factory.val; +import static org.jooq.util.oracle.OracleFactory.connectByIsCycle; +import static org.jooq.util.oracle.OracleFactory.connectByIsLeaf; +import static org.jooq.util.oracle.OracleFactory.level; +import static org.jooq.util.oracle.OracleFactory.prior; +import static org.jooq.util.oracle.OracleFactory.rownum; +import static org.jooq.util.oracle.OracleFactory.sysConnectByPath; + +import java.util.Arrays; +import java.util.List; import org.jooq.Field; import org.jooq.Record; @@ -214,7 +226,7 @@ extends BaseTest result = + create().select(rownum(), connectByIsCycle(), connectByIsLeaf()) + .connectByNoCycle(level().lessThan(4)) + .fetch(); + + assertEquals(Integer.valueOf(1), result.getValue(0, rownum())); + assertEquals(Integer.valueOf(2), result.getValue(1, rownum())); + assertEquals(Integer.valueOf(3), result.getValue(2, rownum())); + + assertEquals(Boolean.FALSE, result.getValue(0, connectByIsLeaf())); + assertEquals(Boolean.FALSE, result.getValue(1, connectByIsLeaf())); + assertEquals(Boolean.TRUE, result.getValue(2, connectByIsLeaf())); + + assertEquals(Boolean.FALSE, result.getValue(0, connectByIsCycle())); + assertEquals(Boolean.FALSE, result.getValue(1, connectByIsCycle())); + assertEquals(Boolean.FALSE, result.getValue(2, connectByIsCycle())); + } + + @Test + public void testConnectByDirectory() throws Exception { + switch (getDialect()) { + case ASE: + case DB2: + case DERBY: + case H2: + case HSQLDB: + case INGRES: + case MYSQL: + case POSTGRES: + case SQLITE: + case SQLSERVER: + case SYBASE: + log.info("SKIPPING", "Connect by tests"); + return; + } + + List paths = + create().select(substring(sysConnectByPath(TDirectory_NAME(), "/"), 2)) + .from(TDirectory()) + .where(trueCondition()) + .and(trueCondition()) + .connectBy(prior(TDirectory_ID()).equal(TDirectory_PARENT_ID())) + .startWith(TDirectory_PARENT_ID().isNull()) + .orderBy(one()) + .fetch(0); + + assertEquals(26, paths.size()); + assertEquals(Arrays.asList( + "C:", + "C:/eclipse", + "C:/eclipse/configuration", + "C:/eclipse/dropins", + "C:/eclipse/eclipse.exe", + "C:/eclipse/eclipse.ini", + "C:/eclipse/features", + "C:/eclipse/plugins", + "C:/eclipse/p2", + "C:/eclipse/readme", + "C:/eclipse/readme/readme_eclipse.html", + "C:/eclipse/src", + "C:/Program Files", + "C:/Program Files/Internet Explorer", + "C:/Program Files/Internet Explorer/de-DE", + "C:/Program Files/Internet Explorer/ielowutil.exe", + "C:/Program Files/Internet Explorer/iexplore.exe", + "C:/Program Files/Java", + "C:/Program Files/Java/jre6", + "C:/Program Files/Java/jre6/bin", + "C:/Program Files/Java/jre6/bin/java.exe", + "C:/Program Files/Java/jre6/bin/javaw.exe", + "C:/Program Files/Java/jre6/bin/javaws.exe", + "C:/Program Files/Java/jre6/lib", + "C:/Program Files/Java/jre6/lib/javaws.jar", + "C:/Program Files/Java/jre6/lib/rt.jar"), paths); + } } diff --git a/jOOQ-test/src/org/jooq/test/_/testcases/FunctionTests.java b/jOOQ-test/src/org/jooq/test/_/testcases/FunctionTests.java index 336b574d49..cb9befa2d4 100644 --- a/jOOQ-test/src/org/jooq/test/_/testcases/FunctionTests.java +++ b/jOOQ-test/src/org/jooq/test/_/testcases/FunctionTests.java @@ -392,7 +392,8 @@ extends BaseTest result = create().select() @@ -420,7 +423,8 @@ extends BaseTest result = - ora().select(rownum(), connectByIsCycle(), connectByIsLeaf()) - .connectByNoCycle(level().lessThan(4)) - .fetch(); - - assertEquals(Integer.valueOf(1), result.getValue(0, rownum())); - assertEquals(Integer.valueOf(2), result.getValue(1, rownum())); - assertEquals(Integer.valueOf(3), result.getValue(2, rownum())); - - assertEquals(Boolean.FALSE, result.getValue(0, connectByIsLeaf())); - assertEquals(Boolean.FALSE, result.getValue(1, connectByIsLeaf())); - assertEquals(Boolean.TRUE, result.getValue(2, connectByIsLeaf())); - - assertEquals(Boolean.FALSE, result.getValue(0, connectByIsCycle())); - assertEquals(Boolean.FALSE, result.getValue(1, connectByIsCycle())); - assertEquals(Boolean.FALSE, result.getValue(2, connectByIsCycle())); - } - - @Test - public void testOracleConnectByDirectory() throws Exception { - List paths = - ora().select(substring(sysConnectByPath(TDirectory_NAME(), "/"), 2)) - .from(TDirectory()) - .where(trueCondition()) - .and(trueCondition()) - .connectBy(prior(TDirectory_ID()).equal(TDirectory_PARENT_ID())) - .startWith(TDirectory_PARENT_ID().isNull()) - .orderBy(one()) - .fetch(0); - - assertEquals(26, paths.size()); - assertEquals(Arrays.asList( - "C:", - "C:/eclipse", - "C:/eclipse/configuration", - "C:/eclipse/dropins", - "C:/eclipse/eclipse.exe", - "C:/eclipse/eclipse.ini", - "C:/eclipse/features", - "C:/eclipse/plugins", - "C:/eclipse/p2", - "C:/eclipse/readme", - "C:/eclipse/readme/readme_eclipse.html", - "C:/eclipse/src", - "C:/Program Files", - "C:/Program Files/Internet Explorer", - "C:/Program Files/Internet Explorer/de-DE", - "C:/Program Files/Internet Explorer/ielowutil.exe", - "C:/Program Files/Internet Explorer/iexplore.exe", - "C:/Program Files/Java", - "C:/Program Files/Java/jre6", - "C:/Program Files/Java/jre6/bin", - "C:/Program Files/Java/jre6/bin/java.exe", - "C:/Program Files/Java/jre6/bin/javaw.exe", - "C:/Program Files/Java/jre6/bin/javaws.exe", - "C:/Program Files/Java/jre6/lib", - "C:/Program Files/Java/jre6/lib/javaws.jar", - "C:/Program Files/Java/jre6/lib/rt.jar"), paths); - } - // @Test [#1119] TODO reactivate this test public void testOraclePipelinedFunctions() throws Exception { // TODO [#1113] [#1119] Standalone calls to pipelined functions should diff --git a/jOOQ/src/main/java/org/jooq/Table.java b/jOOQ/src/main/java/org/jooq/Table.java index 0f8704c11c..70b320d001 100644 --- a/jOOQ/src/main/java/org/jooq/Table.java +++ b/jOOQ/src/main/java/org/jooq/Table.java @@ -182,6 +182,7 @@ public interface Table extends Type, AliasProvider *

* This has been observed to work with all dialects */ + @Support DivideByOnStep divideBy(Table divisor); /** diff --git a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java index 93dbb22ebd..0811a2c7e9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java @@ -336,14 +336,15 @@ class InsertQueryImpl extends AbstractStoreQuery implements // SQLite will select last_insert_rowid() after the INSER case SQLITE: // Sybase will select @@identity after the INSERT + case CUBRID: case SYBASE: super.prepare(ctx); return; // Some dialects can only return AUTO_INCREMENT values // Other values have to be fetched in a second step + // [#1260] TODO CUBRID supports this, but there's a JDBC bug case ASE: - case CUBRID: case DERBY: case H2: case INGRES: @@ -397,6 +398,7 @@ class InsertQueryImpl extends AbstractStoreQuery implements // TODO [#832] Fix this. This might be a driver issue. JDBC // Generated keys don't work with jconn3, but they seem to work // with jTDS (which is used for Sybase ASE integration) + case CUBRID: case SYBASE: { listener.executeStart(ctx); result = ctx.statement().executeUpdate(); @@ -408,8 +410,8 @@ class InsertQueryImpl extends AbstractStoreQuery implements // Some dialects can only retrieve "identity" (AUTO_INCREMENT) values // Additional values have to be fetched explicitly + // [#1260] TODO CUBRID supports this, but there's a JDBC bug case ASE: - case CUBRID: case DERBY: case H2: case INGRES: diff --git a/jOOQ/src/main/java/org/jooq/impl/Val.java b/jOOQ/src/main/java/org/jooq/impl/Val.java index 57bc2335d2..d1ccf8e5ad 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Val.java +++ b/jOOQ/src/main/java/org/jooq/impl/Val.java @@ -153,6 +153,10 @@ class Val extends AbstractField implements Param, BindingProvider { // [#722] TODO This is probably not entirely right. case INGRES: + // [#1261] There are only a few corner-cases, where this is + // really needed. Check back on related CUBRID bugs + case CUBRID: + // [#1029] Postgres and [#632] Sybase need explicit casting // in very rare cases. case POSTGRES: @@ -183,7 +187,7 @@ class Val extends AbstractField implements Param, BindingProvider { SQLDataType type = getDataType(context).getSQLDataType(); // [#822] Some RDBMS need precision / scale information on BigDecimals - if (getValue() != null && getType() == BigDecimal.class && asList(DB2, DERBY, HSQLDB).contains(context.getDialect())) { + if (getValue() != null && getType() == BigDecimal.class && asList(CUBRID, DB2, DERBY, HSQLDB).contains(context.getDialect())) { // Add precision / scale on BigDecimals int scale = ((BigDecimal) getValue()).scale(); diff --git a/jOOQ/src/main/java/org/jooq/util/cubrid/CUBRIDDataType.java b/jOOQ/src/main/java/org/jooq/util/cubrid/CUBRIDDataType.java index 6c60d9cebc..87b3b3733d 100644 --- a/jOOQ/src/main/java/org/jooq/util/cubrid/CUBRIDDataType.java +++ b/jOOQ/src/main/java/org/jooq/util/cubrid/CUBRIDDataType.java @@ -79,8 +79,8 @@ public class CUBRIDDataType extends AbstractDataType { public static final CUBRIDDataType VARCHAR = new CUBRIDDataType(SQLDataType.VARCHAR, "varchar"); public static final CUBRIDDataType CHARVARYING = new CUBRIDDataType(SQLDataType.VARCHAR, "char varying"); public static final CUBRIDDataType CHARACTERVARYING = new CUBRIDDataType(SQLDataType.VARCHAR, "character varying"); - public static final CUBRIDDataType CHAR = new CUBRIDDataType(SQLDataType.CHAR, "char"); - public static final CUBRIDDataType CHARACTER = new CUBRIDDataType(SQLDataType.CHAR, "character"); + public static final CUBRIDDataType CHAR = new CUBRIDDataType(SQLDataType.CHAR, "char", "varchar"); + public static final CUBRIDDataType CHARACTER = new CUBRIDDataType(SQLDataType.CHAR, "character", "varchar"); public static final CUBRIDDataType STRING = new CUBRIDDataType(SQLDataType.VARCHAR, "string"); public static final CUBRIDDataType NCHAR = new CUBRIDDataType(SQLDataType.NCHAR, "nchar"); public static final CUBRIDDataType NCHARVARYING = new CUBRIDDataType(SQLDataType.NVARCHAR, "nchar varying");