diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/Databases.java b/jOOQ-meta/src/main/java/org/jooq/meta/Databases.java index b1a6cf27dd..9c3fa4ecde 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/Databases.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/Databases.java @@ -58,6 +58,7 @@ import org.jooq.meta.sqlite.SQLiteDatabase; // ... // ... // ... +// ... /** * A common utility class that provides access to various {@link Database} @@ -98,6 +99,7 @@ public class Databases { + case CUBRID: result = CUBRIDDatabase.class; break; diff --git a/jOOQ/src/main/java/org/jooq/AlterTableRenameColumnToStep.java b/jOOQ/src/main/java/org/jooq/AlterTableRenameColumnToStep.java index 0932fb4f55..901c494d40 100644 --- a/jOOQ/src/main/java/org/jooq/AlterTableRenameColumnToStep.java +++ b/jOOQ/src/main/java/org/jooq/AlterTableRenameColumnToStep.java @@ -48,15 +48,18 @@ public interface AlterTableRenameColumnToStep { /** * Specify a new column name. */ + @Support AlterTableFinalStep to(Field newName); /** * Specify a new column name. */ + @Support AlterTableFinalStep to(Name newName); /** * Specify a new column name. */ + @Support AlterTableFinalStep to(String newName); } \ No newline at end of file diff --git a/jOOQ/src/main/java/org/jooq/AlterTableStep.java b/jOOQ/src/main/java/org/jooq/AlterTableStep.java index f513335f32..9f8e899761 100644 --- a/jOOQ/src/main/java/org/jooq/AlterTableStep.java +++ b/jOOQ/src/main/java/org/jooq/AlterTableStep.java @@ -56,6 +56,7 @@ import static org.jooq.SQLDialect.POSTGRES; // ... // ... // ... +// ... import java.util.Collection; diff --git a/jOOQ/src/main/java/org/jooq/CommentOnIsStep.java b/jOOQ/src/main/java/org/jooq/CommentOnIsStep.java index eb6385731d..d12bdaa0c0 100644 --- a/jOOQ/src/main/java/org/jooq/CommentOnIsStep.java +++ b/jOOQ/src/main/java/org/jooq/CommentOnIsStep.java @@ -46,6 +46,7 @@ import static org.jooq.SQLDialect.MYSQL; // ... import static org.jooq.SQLDialect.POSTGRES; // ... +// ... /** * The step in the COMMENT ON [ object type ] statement where the diff --git a/jOOQ/src/main/java/org/jooq/CreateIndexStep.java b/jOOQ/src/main/java/org/jooq/CreateIndexStep.java index bff1a03a73..9ed82a1439 100644 --- a/jOOQ/src/main/java/org/jooq/CreateIndexStep.java +++ b/jOOQ/src/main/java/org/jooq/CreateIndexStep.java @@ -55,6 +55,7 @@ import static org.jooq.SQLDialect.POSTGRES; import static org.jooq.SQLDialect.SQLITE; // ... // ... +// ... import java.util.Collection; diff --git a/jOOQ/src/main/java/org/jooq/CreateTableAsStep.java b/jOOQ/src/main/java/org/jooq/CreateTableAsStep.java index 9b49aa44af..9249b0050c 100644 --- a/jOOQ/src/main/java/org/jooq/CreateTableAsStep.java +++ b/jOOQ/src/main/java/org/jooq/CreateTableAsStep.java @@ -53,6 +53,7 @@ import static org.jooq.SQLDialect.POSTGRES; // ... import static org.jooq.SQLDialect.SQLITE; // ... +// ... import java.util.Collection; diff --git a/jOOQ/src/main/java/org/jooq/CreateTableWithDataStep.java b/jOOQ/src/main/java/org/jooq/CreateTableWithDataStep.java index f728b25d56..e49c763857 100644 --- a/jOOQ/src/main/java/org/jooq/CreateTableWithDataStep.java +++ b/jOOQ/src/main/java/org/jooq/CreateTableWithDataStep.java @@ -53,6 +53,7 @@ import static org.jooq.SQLDialect.POSTGRES; // ... import static org.jooq.SQLDialect.SQLITE; // ... +// ... /** * A {@link Query} that can create tables. diff --git a/jOOQ/src/main/java/org/jooq/DSLContext.java b/jOOQ/src/main/java/org/jooq/DSLContext.java index 2983228aee..67d24d7190 100644 --- a/jOOQ/src/main/java/org/jooq/DSLContext.java +++ b/jOOQ/src/main/java/org/jooq/DSLContext.java @@ -62,6 +62,7 @@ import static org.jooq.SQLDialect.SQLITE; // ... // ... // ... +// ... import java.math.BigInteger; import java.sql.Connection; diff --git a/jOOQ/src/main/java/org/jooq/DropIndexOnStep.java b/jOOQ/src/main/java/org/jooq/DropIndexOnStep.java index caa70c1036..2441d17850 100644 --- a/jOOQ/src/main/java/org/jooq/DropIndexOnStep.java +++ b/jOOQ/src/main/java/org/jooq/DropIndexOnStep.java @@ -55,6 +55,7 @@ import static org.jooq.SQLDialect.POSTGRES; import static org.jooq.SQLDialect.SQLITE; // ... // ... +// ... /** * A {@link Query} that can drop indexes. diff --git a/jOOQ/src/main/java/org/jooq/Field.java b/jOOQ/src/main/java/org/jooq/Field.java index 1a843a939f..16348da884 100644 --- a/jOOQ/src/main/java/org/jooq/Field.java +++ b/jOOQ/src/main/java/org/jooq/Field.java @@ -59,6 +59,7 @@ import static org.jooq.SQLDialect.SQLITE; // ... // ... // ... +// ... import java.math.BigDecimal; import java.util.Collection; diff --git a/jOOQ/src/main/java/org/jooq/impl/Alias.java b/jOOQ/src/main/java/org/jooq/impl/Alias.java index f970aa893d..df765b3a7d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Alias.java +++ b/jOOQ/src/main/java/org/jooq/impl/Alias.java @@ -61,6 +61,7 @@ import static org.jooq.SQLDialect.POSTGRES; import static org.jooq.SQLDialect.SQLITE; // ... // ... +// ... import static org.jooq.impl.DSL.asterisk; import static org.jooq.impl.DSL.falseCondition; import static org.jooq.impl.DSL.field; diff --git a/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java b/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java index 35341466b1..1482861a17 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java @@ -65,6 +65,7 @@ import static org.jooq.SQLDialect.MYSQL; // ... import static org.jooq.SQLDialect.POSTGRES; // ... +// ... import static org.jooq.impl.DSL.alterTable; import static org.jooq.impl.DSL.commentOnTable; import static org.jooq.impl.DSL.constraint; @@ -98,6 +99,7 @@ import static org.jooq.impl.Keywords.K_MODIFY; import static org.jooq.impl.Keywords.K_NOT_NULL; import static org.jooq.impl.Keywords.K_NULL; import static org.jooq.impl.Keywords.K_RAISE; +import static org.jooq.impl.Keywords.K_RENAME; import static org.jooq.impl.Keywords.K_RENAME_COLUMN; import static org.jooq.impl.Keywords.K_RENAME_CONSTRAINT; import static org.jooq.impl.Keywords.K_RENAME_INDEX; @@ -176,7 +178,8 @@ final class AlterTableImpl extends AbstractQuery implements private static final EnumSet NO_SUPPORT_IF_EXISTS_COLUMN = EnumSet.of(CUBRID, DERBY, FIREBIRD); private static final EnumSet SUPPORT_RENAME_TABLE = EnumSet.of(DERBY); private static final EnumSet NO_SUPPORT_ALTER_TYPE_AND_NULL = EnumSet.of(POSTGRES); - private static final EnumSet REQUIRE_REPEAT_KEYWORD_ON_MULTI_ALTER = EnumSet.of(FIREBIRD, MARIADB, MYSQL); + private static final EnumSet REQUIRE_REPEAT_ADD_ON_MULTI_ALTER = EnumSet.of(FIREBIRD, MARIADB, MYSQL); + private static final EnumSet REQUIRE_REPEAT_DROP_ON_MULTI_ALTER = EnumSet.of(FIREBIRD, MARIADB, MYSQL); @@ -826,6 +829,18 @@ final class AlterTableImpl extends AbstractQuery implements .qualify(qualify); break; + + + + + + + + + + + + default: ctx.qualify(false) .visit(K_RENAME_COLUMN).sql(' ') @@ -882,13 +897,17 @@ final class AlterTableImpl extends AbstractQuery implements } else if (add != null) { boolean qualify = ctx.qualify(); + boolean multiAdd = REQUIRE_REPEAT_ADD_ON_MULTI_ALTER.contains(ctx.family()); ctx.start(ALTER_TABLE_ADD) .visit(K_ADD) .qualify(false) - .sql(" ("); + .sql(' '); - boolean indent = add.size() > 1; + if (!multiAdd) + ctx.sql('('); + + boolean indent = !multiAdd && add.size() > 1; if (indent) ctx.formatIndentStart() @@ -896,7 +915,10 @@ final class AlterTableImpl extends AbstractQuery implements for (int i = 0; i < add.size(); i++) { if (i > 0) - ctx.sql(',').formatSeparator(); + if (multiAdd) + ctx.sql(',').formatSeparator().visit(K_ADD).sql(' '); + else + ctx.sql(',').formatSeparator(); FieldOrConstraint part = add.get(i); ctx.visit(part); @@ -911,8 +933,10 @@ final class AlterTableImpl extends AbstractQuery implements ctx.formatIndentEnd() .formatNewLine(); - ctx.sql(')') - .qualify(qualify) + if (!multiAdd) + ctx.sql(')'); + + ctx.qualify(qualify) .end(ALTER_TABLE_ADD); } else if (addColumn != null) { @@ -1085,7 +1109,7 @@ final class AlterTableImpl extends AbstractQuery implements else if (dropColumns != null) { ctx.start(ALTER_TABLE_DROP); - if (REQUIRE_REPEAT_KEYWORD_ON_MULTI_ALTER.contains(family)) { + if (REQUIRE_REPEAT_DROP_ON_MULTI_ALTER.contains(family)) { String separator = ""; for (Field dropColumn : dropColumns) { diff --git a/jOOQ/src/main/java/org/jooq/impl/BetweenCondition.java b/jOOQ/src/main/java/org/jooq/impl/BetweenCondition.java index ed564e1b52..c4d7f1b040 100644 --- a/jOOQ/src/main/java/org/jooq/impl/BetweenCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/BetweenCondition.java @@ -60,6 +60,7 @@ import static org.jooq.SQLDialect.SQLITE; // ... // ... // ... +// ... import static org.jooq.impl.DSL.nullSafe; import static org.jooq.impl.DSL.val; import static org.jooq.impl.Keywords.K_AND; @@ -88,7 +89,7 @@ final class BetweenCondition extends AbstractCondition implements BetweenAndS private static final Clause[] CLAUSES_BETWEEN_SYMMETRIC = { CONDITION, CONDITION_BETWEEN_SYMMETRIC }; private static final Clause[] CLAUSES_NOT_BETWEEN = { CONDITION, CONDITION_NOT_BETWEEN }; private static final Clause[] CLAUSES_NOT_BETWEEN_SYMMETRIC = { CONDITION, CONDITION_NOT_BETWEEN_SYMMETRIC }; - private static final EnumSet SUPPORTS_SYMMETRIC = EnumSet.of(CUBRID, DERBY, FIREBIRD, H2, MARIADB, MYSQL, SQLITE); + private static final EnumSet NO_SUPPORT_SYMMETRIC = EnumSet.of(CUBRID, DERBY, FIREBIRD, H2, MARIADB, MYSQL, SQLITE); private final boolean symmetric; private final boolean not; @@ -115,9 +116,8 @@ final class BetweenCondition extends AbstractCondition implements BetweenAndS this.maxValue = nullSafe(f, field.getDataType()); return this; } - else { + else return super.and(f); - } } @Override @@ -131,14 +131,12 @@ final class BetweenCondition extends AbstractCondition implements BetweenAndS } private final QueryPartInternal delegate(Configuration configuration) { - if (symmetric && SUPPORTS_SYMMETRIC.contains(configuration.family())) { + if (symmetric && NO_SUPPORT_SYMMETRIC.contains(configuration.family())) return not ? (QueryPartInternal) field.notBetween(minValue, maxValue).and(field.notBetween(maxValue, minValue)) : (QueryPartInternal) field.between(minValue, maxValue).or(field.between(maxValue, minValue)); - } - else { + else return new Native(); - } } private class Native extends AbstractQueryPart { diff --git a/jOOQ/src/main/java/org/jooq/impl/BitCount.java b/jOOQ/src/main/java/org/jooq/impl/BitCount.java index 97223ba3b0..c5e0e03493 100644 --- a/jOOQ/src/main/java/org/jooq/impl/BitCount.java +++ b/jOOQ/src/main/java/org/jooq/impl/BitCount.java @@ -79,6 +79,9 @@ final class BitCount extends AbstractFunction { + + + // Better solutions very welcome! See also: // See also http://stackoverflow.com/questions/7946349/how-to-simulate-the-mysql-bit-count-function-in-sybase-sql-anywhere case H2: diff --git a/jOOQ/src/main/java/org/jooq/impl/CommentOnImpl.java b/jOOQ/src/main/java/org/jooq/impl/CommentOnImpl.java index 4781dec936..d6d759f9fb 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CommentOnImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CommentOnImpl.java @@ -38,6 +38,7 @@ package org.jooq.impl; import static org.jooq.SQLDialect.POSTGRES; +// ... import static org.jooq.impl.DSL.comment; import static org.jooq.impl.DSL.inline; import static org.jooq.impl.Keywords.K_ALTER_TABLE; diff --git a/jOOQ/src/main/java/org/jooq/impl/Cot.java b/jOOQ/src/main/java/org/jooq/impl/Cot.java index 0cadf8eba3..a004c179bb 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Cot.java +++ b/jOOQ/src/main/java/org/jooq/impl/Cot.java @@ -73,6 +73,7 @@ final class Cot extends AbstractFunction { + default: return function("cot", SQLDataType.NUMERIC, argument); } diff --git a/jOOQ/src/main/java/org/jooq/impl/CreateIndexImpl.java b/jOOQ/src/main/java/org/jooq/impl/CreateIndexImpl.java index 3959d1d646..744ea50d52 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CreateIndexImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CreateIndexImpl.java @@ -48,6 +48,7 @@ import static org.jooq.SQLDialect.FIREBIRD; // ... import static org.jooq.SQLDialect.POSTGRES; // ... +// ... import static org.jooq.impl.DSL.name; import static org.jooq.impl.DSL.table; import static org.jooq.impl.Keywords.K_CREATE; @@ -72,7 +73,6 @@ import org.jooq.Configuration; import org.jooq.Context; import org.jooq.CreateIndexIncludeStep; import org.jooq.CreateIndexStep; -import org.jooq.CreateIndexWhereStep; import org.jooq.Field; import org.jooq.Index; import org.jooq.Name; @@ -90,8 +90,7 @@ final class CreateIndexImpl extends AbstractQuery implements // Cascading interface implementations for CREATE INDEX behaviour CreateIndexStep, - CreateIndexIncludeStep, - CreateIndexWhereStep { + CreateIndexIncludeStep { /** * Generated UID @@ -268,6 +267,7 @@ final class CreateIndexImpl extends AbstractQuery implements .sql(' '); boolean supportsInclude = false ; + boolean supportsFieldsBeforeTable = false ; QueryPartList list = new QueryPartList(); if (fields != null) @@ -278,14 +278,27 @@ final class CreateIndexImpl extends AbstractQuery implements if (!supportsInclude && include != null) list.addAll(asList(include)); + + + + + + + + + ctx.visit(K_ON) .sql(' ') - .visit(table) - .sql('(') - .qualify(false) - .visit(list) - .qualify(true) - .sql(')'); + .visit(table); + + + + + ctx.sql('(') + .qualify(false) + .visit(list) + .qualify(true) + .sql(')'); if (supportsInclude && include != null) ctx.formatSeparator() diff --git a/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java b/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java index 2237dde1e6..ac624d74ac 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java @@ -63,6 +63,7 @@ import static org.jooq.SQLDialect.POSTGRES; import static org.jooq.SQLDialect.SQLITE; // ... // ... +// ... import static org.jooq.impl.DSL.commentOnTable; import static org.jooq.impl.DSL.createIndex; import static org.jooq.impl.DSL.field; diff --git a/jOOQ/src/main/java/org/jooq/impl/CreateViewImpl.java b/jOOQ/src/main/java/org/jooq/impl/CreateViewImpl.java index 14b8338da4..0d20e8a7b2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CreateViewImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CreateViewImpl.java @@ -51,6 +51,7 @@ import static org.jooq.SQLDialect.H2; import static org.jooq.SQLDialect.POSTGRES; import static org.jooq.SQLDialect.SQLITE; // ... +// ... import static org.jooq.conf.ParamType.INLINED; import static org.jooq.impl.DSL.name; import static org.jooq.impl.DSL.selectFrom; @@ -175,14 +176,15 @@ final class CreateViewImpl extends AbstractQuery implements // [#3835] SQLite doesn't like renaming columns at the view level boolean rename = fields != null && fields.length > 0; boolean renameSupported = ctx.family() != SQLITE; + boolean replaceSupported = false ; // [#4806] CREATE VIEW doesn't accept parameters in most databases ParamType paramType = ctx.paramType(); ctx.start(CREATE_VIEW_NAME) - .visit(K_CREATE); + .visit(replaceSupported && orReplace ? K_REPLACE : K_CREATE); - if (orReplace && !NO_SUPPORT_OR_REPLACE.contains(ctx.family())) { + if (orReplace && !replaceSupported && !NO_SUPPORT_OR_REPLACE.contains(ctx.family())) { ctx.sql(' ').visit(K_OR); switch (ctx.family()) { diff --git a/jOOQ/src/main/java/org/jooq/impl/CurrentDate.java b/jOOQ/src/main/java/org/jooq/impl/CurrentDate.java index 16b5664de9..ea1993841a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CurrentDate.java +++ b/jOOQ/src/main/java/org/jooq/impl/CurrentDate.java @@ -81,6 +81,7 @@ final class CurrentDate extends AbstractFunction { + case DERBY: diff --git a/jOOQ/src/main/java/org/jooq/impl/CurrentTime.java b/jOOQ/src/main/java/org/jooq/impl/CurrentTime.java index 1951982323..fb16b1fb9b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CurrentTime.java +++ b/jOOQ/src/main/java/org/jooq/impl/CurrentTime.java @@ -73,6 +73,7 @@ final class CurrentTime extends AbstractFunction { + case DERBY: case FIREBIRD: case HSQLDB: diff --git a/jOOQ/src/main/java/org/jooq/impl/CurrentTimestamp.java b/jOOQ/src/main/java/org/jooq/impl/CurrentTimestamp.java index 40d0449ee6..2fc884e63e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CurrentTimestamp.java +++ b/jOOQ/src/main/java/org/jooq/impl/CurrentTimestamp.java @@ -81,6 +81,7 @@ final class CurrentTimestamp extends AbstractFunction { + case DERBY: diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 9b6ac13f66..8e1cb380c2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -70,6 +70,7 @@ import static org.jooq.SQLDialect.SQLITE; // ... // ... // ... +// ... import static org.jooq.impl.Term.ROW_NUMBER; import static org.jooq.impl.Tools.EMPTY_FIELD; import static org.jooq.impl.Tools.EMPTY_QUERYPART; @@ -13048,7 +13049,7 @@ public class DSL { */ @Support({ POSTGRES }) public static Field translate(Field text, Field from, Field to) { - return function("translate", text.getDataType(), text, from, to); + return new Translate(text, from, to); } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java index 65a298db34..af8c3cde12 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultBinding.java @@ -58,6 +58,7 @@ import static org.jooq.SQLDialect.POSTGRES; import static org.jooq.SQLDialect.SQLITE; // ... // ... +// ... import static org.jooq.conf.ParamType.INLINED; import static org.jooq.impl.DSL.cast; import static org.jooq.impl.DSL.inline; @@ -1664,6 +1665,11 @@ public class DefaultBinding implements Binding { + + + + + else if (ctx.family() == POSTGRES) ctx.render() .sql("E'") diff --git a/jOOQ/src/main/java/org/jooq/impl/Dual.java b/jOOQ/src/main/java/org/jooq/impl/Dual.java index 858eb06f18..9e19841844 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Dual.java +++ b/jOOQ/src/main/java/org/jooq/impl/Dual.java @@ -59,8 +59,17 @@ final class Dual extends AbstractTable { + static final String DUAL_HSQLDB = "select 1 as dual from information_schema.system_users limit 1"; + + + + + static final Name DUAL_FIREBIRD = DSL.unquotedName("RDB$DATABASE"); + static final Name DUAL_CUBRID = DSL.unquotedName("db_root"); + static final Name DUAL_DERBY = DSL.unquotedName("SYSIBM", "SYSDUMMY1"); + private final boolean force; Dual() { @@ -68,7 +77,7 @@ final class Dual extends AbstractTable { } Dual(boolean force) { - super("dual", (Schema) null); + super(DSL.name("dual"), (Schema) null); this.force = force; } @@ -122,7 +131,7 @@ final class Dual extends AbstractTable { break; case FIREBIRD: - ctx.literal("RDB$DATABASE"); + ctx.visit(DUAL_FIREBIRD); break; case HSQLDB: @@ -130,7 +139,7 @@ final class Dual extends AbstractTable { break; case CUBRID: - ctx.literal("db_root"); + ctx.visit(DUAL_CUBRID); break; // These dialects don't have a DUAL table. But emulation is needed @@ -163,9 +172,7 @@ final class Dual extends AbstractTable { case DERBY: - ctx.literal("SYSIBM") - .sql('.') - .literal("SYSDUMMY1"); + ctx.visit(DUAL_DERBY); break; case MARIADB: diff --git a/jOOQ/src/main/java/org/jooq/impl/Expression.java b/jOOQ/src/main/java/org/jooq/impl/Expression.java index d6060282a5..a2ab2032b0 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Expression.java +++ b/jOOQ/src/main/java/org/jooq/impl/Expression.java @@ -54,6 +54,7 @@ import static org.jooq.SQLDialect.SQLITE; // ... // ... // ... +// ... import static org.jooq.impl.DSL.function; import static org.jooq.impl.DSL.inline; import static org.jooq.impl.DSL.two; @@ -165,35 +166,35 @@ final class Expression extends AbstractFunction { DSL.bitNot(DSL.bitAnd(lhsAsNumber(), rhsAsNumber())), DSL.bitOr(lhsAsNumber(), rhsAsNumber())); + + + + + + + // Many dialects don't support shifts. Use multiplication/division instead - else if (SHL == operator && EMULATE_SHR_SHL.contains(family)) { + else if (SHL == operator && EMULATE_SHR_SHL.contains(family)) return lhs.mul((Field) DSL.power(two(), rhsAsNumber()).cast(lhs)); - } // [#3962] This emulation is expensive. If this is emulated, BitCount should // use division instead of SHR directly - else if (SHR == operator && EMULATE_SHR_SHL.contains(family)) { + else if (SHR == operator && EMULATE_SHR_SHL.contains(family)) return lhs.div((Field) DSL.power(two(), rhsAsNumber()).cast(lhs)); - } // Some dialects support shifts as functions - else if (SHL == operator && FIREBIRD == family) { + else if (SHL == operator && FIREBIRD == family) return function("bin_shl", getDataType(), getArguments()); - } - else if (SHR == operator && FIREBIRD == family) { + else if (SHR == operator && FIREBIRD == family) return function("bin_shr", getDataType(), getArguments()); - } // These operators are not supported in any dialect - else if (BIT_NAND == operator) { + else if (BIT_NAND == operator) return (Field) DSL.bitNot(DSL.bitAnd(lhsAsNumber(), rhsAsNumber())); - } - else if (BIT_NOR == operator) { + else if (BIT_NOR == operator) return (Field) DSL.bitNot(DSL.bitOr(lhsAsNumber(), rhsAsNumber())); - } - else if (BIT_XNOR == operator) { + else if (BIT_XNOR == operator) return (Field) DSL.bitNot(DSL.bitXor(lhsAsNumber(), rhsAsNumber())); - } // --------------------------------------------------------------------- // XXX: Date time arithmetic operators @@ -203,19 +204,16 @@ final class Expression extends AbstractFunction { else if ((ADD == operator || SUBTRACT == operator) && lhs.getDataType().isDateTime() && (rhs.get(0).getDataType().isNumeric() || - rhs.get(0).getDataType().isInterval())) { - + rhs.get(0).getDataType().isInterval())) return new DateExpression(); - } // --------------------------------------------------------------------- // XXX: Other operators // --------------------------------------------------------------------- // Use the default operator expression for all other cases - else { + else return new DefaultExpression(); - } } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java b/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java index c2d5389518..02e1e4cd4c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java +++ b/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java @@ -41,6 +41,7 @@ import static org.jooq.SQLDialect.POSTGRES; // ... import static org.jooq.SQLDialect.SQLITE; // ... +// ... import java.util.EnumSet; import java.util.Map; diff --git a/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java b/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java index 6badcf8513..4d1bc2d64a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java +++ b/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java @@ -137,12 +137,13 @@ final class FieldMapsForInsert extends AbstractQueryPart { + case FIREBIRD: { ctx.formatSeparator() .start(INSERT_SELECT); - ctx.visit(insertSelect(ctx)); + ctx.visit(insertSelect()); ctx.end(INSERT_SELECT); break; @@ -162,7 +163,7 @@ final class FieldMapsForInsert extends AbstractQueryPart { } } - private final Select insertSelect(Context context) { + private final Select insertSelect() { Select select = null; for (int row = 0; row < rows; row++) { @@ -171,7 +172,7 @@ final class FieldMapsForInsert extends AbstractQueryPart { for (List> list : values.values()) fields.add(list.get(row)); - Select iteration = DSL.using(context.configuration()).select(fields); + Select iteration = DSL.select(fields); if (select == null) select = iteration; diff --git a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java index e319090b07..5dcf23b820 100644 --- a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java @@ -366,6 +366,7 @@ final class InsertQueryImpl extends AbstractStoreQuery impl + case HSQLDB: { ctx.visit(toMerge(ctx.configuration())); break; @@ -463,6 +464,7 @@ final class InsertQueryImpl extends AbstractStoreQuery impl + case HSQLDB: { diff --git a/jOOQ/src/main/java/org/jooq/impl/JoinTable.java b/jOOQ/src/main/java/org/jooq/impl/JoinTable.java index d926127df7..8c45e3cf73 100755 --- a/jOOQ/src/main/java/org/jooq/impl/JoinTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/JoinTable.java @@ -78,6 +78,7 @@ import static org.jooq.SQLDialect.H2; import static org.jooq.SQLDialect.POSTGRES; // ... // ... +// ... import static org.jooq.impl.DSL.condition; import static org.jooq.impl.DSL.exists; import static org.jooq.impl.DSL.notExists; diff --git a/jOOQ/src/main/java/org/jooq/impl/Ln.java b/jOOQ/src/main/java/org/jooq/impl/Ln.java index d9c13df1ed..1642a1f596 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Ln.java +++ b/jOOQ/src/main/java/org/jooq/impl/Ln.java @@ -99,6 +99,7 @@ final class Ln extends AbstractFunction { + case DERBY: case H2: case HSQLDB: diff --git a/jOOQ/src/main/java/org/jooq/impl/Mod.java b/jOOQ/src/main/java/org/jooq/impl/Mod.java index 225dc85658..8f23d748d6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Mod.java +++ b/jOOQ/src/main/java/org/jooq/impl/Mod.java @@ -74,6 +74,7 @@ final class Mod extends AbstractFunction { + case SQLITE: return new Expression(MODULO, arg1, arg2); } diff --git a/jOOQ/src/main/java/org/jooq/impl/Neg.java b/jOOQ/src/main/java/org/jooq/impl/Neg.java index 5978c82b1e..f19a7afa68 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Neg.java +++ b/jOOQ/src/main/java/org/jooq/impl/Neg.java @@ -44,6 +44,7 @@ import static org.jooq.SQLDialect.HSQLDB; // ... // ... // ... +// ... import static org.jooq.impl.ExpressionOperator.BIT_NOT; import java.util.EnumSet; @@ -81,28 +82,24 @@ final class Neg extends AbstractField { public final void accept(Context ctx) { SQLDialect family = ctx.configuration().dialect().family(); - if (operator == BIT_NOT && EMULATE_BIT_NOT.contains(family)) { + if (operator == BIT_NOT && EMULATE_BIT_NOT.contains(family)) ctx.sql("(0 - ") .visit(field) .sql(" - 1)"); - } - - else if (operator == BIT_NOT && family == FIREBIRD) { + else if (operator == BIT_NOT && family == FIREBIRD) ctx.sql("bin_not(") .visit(field) .sql(')'); - } - else { + else ctx.sql(operator.toSQL()) .sql('(') .visit(field) .sql(')'); - } } } diff --git a/jOOQ/src/main/java/org/jooq/impl/Repeat.java b/jOOQ/src/main/java/org/jooq/impl/Repeat.java index 4378b8aebf..0f68f73b79 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Repeat.java +++ b/jOOQ/src/main/java/org/jooq/impl/Repeat.java @@ -71,6 +71,7 @@ final class Repeat extends AbstractFunction { + case FIREBIRD: return DSL.rpad(string, DSL.length(string).mul(count), string); diff --git a/jOOQ/src/main/java/org/jooq/impl/SQLDataType.java b/jOOQ/src/main/java/org/jooq/impl/SQLDataType.java index 86695c56ff..6997132c93 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SQLDataType.java +++ b/jOOQ/src/main/java/org/jooq/impl/SQLDataType.java @@ -82,6 +82,7 @@ import org.jooq.util.sqlite.SQLiteDataType; // ... // ... // ... +// ... @@ -596,6 +597,7 @@ public final class SQLDataType { + Class.forName(CUBRIDDataType.class.getName()); Class.forName(DerbyDataType.class.getName()); Class.forName(FirebirdDataType.class.getName()); diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index 2781b3d6f3..b19437b697 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -81,6 +81,7 @@ import static org.jooq.SQLDialect.SQLITE; // ... // ... // ... +// ... import static org.jooq.SortOrder.DESC; import static org.jooq.impl.CombineOperator.EXCEPT; import static org.jooq.impl.CombineOperator.EXCEPT_ALL; diff --git a/jOOQ/src/main/java/org/jooq/impl/Space.java b/jOOQ/src/main/java/org/jooq/impl/Space.java index 0adeec3de4..41ff98eb21 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Space.java +++ b/jOOQ/src/main/java/org/jooq/impl/Space.java @@ -67,6 +67,7 @@ final class Space extends AbstractFunction { + case DERBY: case FIREBIRD: case HSQLDB: diff --git a/jOOQ/src/main/java/org/jooq/impl/Substring.java b/jOOQ/src/main/java/org/jooq/impl/Substring.java index fff26a16aa..a392f4470b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Substring.java +++ b/jOOQ/src/main/java/org/jooq/impl/Substring.java @@ -63,7 +63,10 @@ final class Substring extends AbstractFunction { switch (configuration.family()) { - // [#430] Firebird has its own syntax + // [#430] These databases use SQL standard syntax + + + case FIREBIRD: { if (getArguments().length == 2) { return DSL.field("{substring}({0} {from} {1})", SQLDataType.VARCHAR, getArguments()); diff --git a/jOOQ/src/main/java/org/jooq/impl/WidthBucket.java b/jOOQ/src/main/java/org/jooq/impl/WidthBucket.java index c9bc7f7bac..751f13e11c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/WidthBucket.java +++ b/jOOQ/src/main/java/org/jooq/impl/WidthBucket.java @@ -73,6 +73,10 @@ final class WidthBucket extends AbstractField { + + + + case POSTGRES: ctx.visit(DSL.field("{width_bucket}({0}, {1}, {2}, {3})", getType(), field, low, high, buckets)); break; diff --git a/jOOQ/src/main/java/org/jooq/tools/jdbc/JDBCUtils.java b/jOOQ/src/main/java/org/jooq/tools/jdbc/JDBCUtils.java index eebbd0a17e..df84e082c3 100644 --- a/jOOQ/src/main/java/org/jooq/tools/jdbc/JDBCUtils.java +++ b/jOOQ/src/main/java/org/jooq/tools/jdbc/JDBCUtils.java @@ -75,6 +75,7 @@ import static org.jooq.SQLDialect.SQLITE; // ... // ... // ... +// ... import java.sql.Array; import java.sql.Blob; @@ -261,9 +262,8 @@ public class JDBCUtils { * "Guess" the {@link SQLDialect} from a connection URL. */ public static final SQLDialect dialect(String url) { - if (url == null) { + if (url == null) return DEFAULT; - } // The below list might not be accurate or complete. Feel free to // contribute fixes related to new / different JDBC driver configurations @@ -281,44 +281,27 @@ public class JDBCUtils { - - else if (url.contains(":cubrid:")) { + else if (url.contains(":cubrid:")) return CUBRID; - } - else if (url.contains(":derby:")) { + else if (url.contains(":derby:")) return DERBY; - } - else if (url.contains(":firebirdsql:")) { + else if (url.contains(":firebirdsql:")) return FIREBIRD; - } - else if (url.contains(":h2:")) { + else if (url.contains(":h2:")) return H2; - } - else if (url.contains(":hsqldb:")) { + else if (url.contains(":hsqldb:")) return HSQLDB; - } - else if (url.contains(":mariadb:")) { + else if (url.contains(":mariadb:")) return MARIADB; - } else if (url.contains(":mysql:") - || url.contains(":google:")) { + || url.contains(":google:")) return MYSQL; - } else if (url.contains(":postgresql:") - || url.contains(":pgsql:")) { + || url.contains(":pgsql:")) return POSTGRES; - } else if (url.contains(":sqlite:") - || url.contains(":sqldroid:")) { + || url.contains(":sqldroid:")) return SQLITE; - } - - - - - - - @@ -393,6 +376,8 @@ public class JDBCUtils { + +