[#7358] Add support for SQL Data Warehouse

This commit is contained in:
lukaseder 2018-05-25 18:30:57 +02:00
parent 9cf6e785a9
commit 0512228565
92 changed files with 265 additions and 79 deletions

View File

@ -42,6 +42,7 @@ import static java.util.Arrays.asList;
import static org.jooq.SQLDialect.MARIADB;
import static org.jooq.SQLDialect.MYSQL;
// ...
// ...
import java.util.ArrayList;
import java.util.List;

View File

@ -71,6 +71,7 @@ public abstract class AbstractIndexDefinition extends AbstractDefinition impleme
default:
result.addAll(getSchema().getDefinitionPath());
}

View File

@ -55,6 +55,7 @@ import org.jooq.meta.mysql.MySQLDatabase;
// ...
import org.jooq.meta.postgres.PostgresDatabase;
// ...
// ...
import org.jooq.meta.sqlite.SQLiteDatabase;
// ...
// ...
@ -105,26 +106,27 @@ public class Databases {
case CUBRID: result = CUBRIDDatabase.class; break;
case DERBY: result = DerbyDatabase.class; break;
case CUBRID: result = CUBRIDDatabase.class; break;
case DERBY: result = DerbyDatabase.class; break;
case FIREBIRD_2_5:
case FIREBIRD_3_0:
case FIREBIRD: result = FirebirdDatabase.class; break;
case H2: result = H2Database.class; break;
case HSQLDB: result = HSQLDBDatabase.class; break;
case MARIADB: result = MariaDBDatabase.class; break;
case FIREBIRD: result = FirebirdDatabase.class; break;
case H2: result = H2Database.class; break;
case HSQLDB: result = HSQLDBDatabase.class; break;
case MARIADB: result = MariaDBDatabase.class; break;
case MYSQL_5_7:
case MYSQL_8_0:
case MYSQL: result = MySQLDatabase.class; break;
case MYSQL: result = MySQLDatabase.class; break;
case POSTGRES_9_3:
case POSTGRES_9_4:
case POSTGRES_9_5:
case POSTGRES_10:
case POSTGRES: result = PostgresDatabase.class; break;
case SQLITE: result = SQLiteDatabase.class; break;
case POSTGRES: result = PostgresDatabase.class; break;
case SQLITE: result = SQLiteDatabase.class; break;
case DEFAULT:
case SQL99: result = JDBCDatabase.class; break;
case SQL99: result = JDBCDatabase.class; break;
}
return result;

View File

@ -12,6 +12,7 @@ import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
@ -20,6 +21,7 @@ import javax.xml.bind.annotation.XmlList;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import org.jooq.util.jaxb.tools.StringAdapter;
@ -154,6 +156,7 @@ public class Database implements Serializable
* <p>
* Natively supported values are:
* <ul>
* <li>{@link org.jooq.meta.auroramysql.AuroraMySQLDatabase}</li>
* <li>{@link org.jooq.meta.ase.ASEDatabase}</li>
* <li>{@link org.jooq.meta.cubrid.CUBRIDDatabase}</li>
* <li>{@link org.jooq.meta.db2.DB2Database}</li>
@ -170,8 +173,10 @@ public class Database implements Serializable
* <li>{@link org.jooq.meta.postgres.PostgresDatabase}</li>
* <li>{@link org.jooq.meta.redshift.RedshiftDatabase}</li>
* <li>{@link org.jooq.meta.sqlite.SQLiteDatabase}</li>
* <li>{@link org.jooq.meta.sqldatawarehouse.SQLDataWarehouseDatabase}</li>
* <li>{@link org.jooq.meta.sqlserver.SQLServerDatabase}</li>
* <li>{@link org.jooq.meta.sybase.SybaseDatabase}</li>
* <li>{@link org.jooq.meta.teradata.TeradataDatabase}</li>
* <li>{@link org.jooq.meta.vertica.VerticaDatabase}</li>
* </ul>
* <p>
@ -833,6 +838,7 @@ public class Database implements Serializable
* {@link Boolean }
*
*/
@Deprecated
public Boolean isIgnoreProcedureReturnValues() {
return ignoreProcedureReturnValues;
}

View File

@ -380,6 +380,13 @@ public enum SQLDialect {

View File

@ -550,6 +550,7 @@ abstract class AbstractDMLQuery<R extends Record> extends AbstractQuery {
case DERBY:
case H2:
case MARIADB:
@ -662,6 +663,7 @@ abstract class AbstractDMLQuery<R extends Record> extends AbstractQuery {
case DERBY:
case H2:
case MARIADB:

View File

@ -43,6 +43,7 @@ import static org.jooq.ExecuteType.DDL;
// ...
// ...
// ...
// ...
import static org.jooq.conf.ParamType.INDEXED;
import static org.jooq.conf.ParamType.INLINED;
import static org.jooq.conf.SettingsTools.executePreparedStatements;

View File

@ -43,6 +43,7 @@ import static java.util.concurrent.Executors.newSingleThreadExecutor;
import static org.jooq.SQLDialect.CUBRID;
import static org.jooq.SQLDialect.POSTGRES;
// ...
// ...
import static org.jooq.impl.DSL.field;
import static org.jooq.impl.DSL.name;
import static org.jooq.impl.Tools.blocking;

View File

@ -44,6 +44,7 @@ import static org.jooq.SQLDialect.FIREBIRD;
// ...
import static org.jooq.SQLDialect.POSTGRES;
// ...
// ...
import static org.jooq.XMLFormat.RecordFormat.COLUMN_NAME_ELEMENTS;
import static org.jooq.conf.ThrowExceptions.THROW_NONE;
import static org.jooq.impl.DSL.field;

View File

@ -56,9 +56,10 @@ import static org.jooq.SQLDialect.HSQLDB;
// ...
// ...
import static org.jooq.SQLDialect.MARIADB;
import static org.jooq.SQLDialect.*;
import static org.jooq.SQLDialect.MYSQL;
// ...
import static org.jooq.SQLDialect.POSTGRES;
// ...
import static org.jooq.SQLDialect.SQLITE;
// ...
// ...

View File

@ -48,6 +48,7 @@ import static org.jooq.SQLDialect.DERBY;
import static org.jooq.SQLDialect.FIREBIRD;
// ...
// ...
// ...
import static org.jooq.impl.DSL.index;
import static org.jooq.impl.DSL.inline;
import static org.jooq.impl.DSL.name;
@ -205,6 +206,7 @@ final class AlterIndexImpl extends AbstractQuery implements
default: {

View File

@ -62,11 +62,12 @@ import static org.jooq.SQLDialect.FIREBIRD;
// ...
import static org.jooq.SQLDialect.HSQLDB;
import static org.jooq.SQLDialect.MARIADB;
import static org.jooq.SQLDialect.*;
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;
@ -104,6 +105,7 @@ 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;
import static org.jooq.impl.Keywords.K_RENAME_OBJECT;
import static org.jooq.impl.Keywords.K_RENAME_TABLE;
import static org.jooq.impl.Keywords.K_RENAME_TO;
import static org.jooq.impl.Keywords.K_SET_DATA_TYPE;
@ -185,6 +187,8 @@ final class AlterTableImpl extends AbstractQuery implements
private final Table<?> table;
private final boolean ifExists;
private boolean ifExistsColumn;
@ -728,6 +732,7 @@ final class AlterTableImpl extends AbstractQuery implements
case MYSQL:
break;
@ -771,10 +776,15 @@ final class AlterTableImpl extends AbstractQuery implements
(renameConstraint != null && family == HSQLDB)
|| (renameColumn != null && family == DERBY);
boolean renameTable = renameTo != null && SUPPORT_RENAME_TABLE.contains(family);
boolean renameObject = renameTo != null && (false );
if (!omitAlterTable) {
ctx.start(ALTER_TABLE_TABLE)
.visit(renameTable ? K_RENAME_TABLE : K_ALTER_TABLE);
.visit(renameObject
? K_RENAME_OBJECT
: renameTable
? K_RENAME_TABLE
: K_ALTER_TABLE);
if (ifExists && supportsIfExists(ctx))
ctx.sql(' ').visit(K_IF_EXISTS);
@ -793,7 +803,7 @@ final class AlterTableImpl extends AbstractQuery implements
ctx.start(ALTER_TABLE_RENAME)
.qualify(false)
.visit(renameTable ? K_TO : K_RENAME_TO).sql(' ')
.visit(renameObject || renameTable ? K_TO : K_RENAME_TO).sql(' ')
.visit(renameTo)
.qualify(qualify)
.end(ALTER_TABLE_RENAME);
@ -903,13 +913,14 @@ 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());
boolean parens = !multiAdd && !NO_SUPPORT_PARENS_ON_MULTI_ALTER.contains(ctx.family());
ctx.start(ALTER_TABLE_ADD)
.visit(K_ADD)
.qualify(false)
.sql(' ');
if (!multiAdd)
if (parens)
ctx.sql('(');
boolean indent = !multiAdd && add.size() > 1;
@ -938,7 +949,7 @@ final class AlterTableImpl extends AbstractQuery implements
ctx.formatIndentEnd()
.formatNewLine();
if (!multiAdd)
if (parens)
ctx.sql(')');
ctx.qualify(qualify)
@ -960,6 +971,7 @@ final class AlterTableImpl extends AbstractQuery implements
case H2:
case MARIADB:
case POSTGRES:
@ -1026,6 +1038,7 @@ final class AlterTableImpl extends AbstractQuery implements
case CUBRID:
case MARIADB:
case MYSQL: {
@ -1197,6 +1210,7 @@ final class AlterTableImpl extends AbstractQuery implements
default:
ctx.visit(K_DROP);
break;
@ -1214,6 +1228,7 @@ final class AlterTableImpl extends AbstractQuery implements
case H2:
case MARIADB:
case POSTGRES:

View File

@ -49,6 +49,7 @@ import static org.jooq.SQLDialect.FIREBIRD;
import static org.jooq.SQLDialect.HSQLDB;
// ...
// ...
// ...
import static org.jooq.impl.DSL.commentOnView;
import static org.jooq.impl.DSL.name;
import static org.jooq.impl.Keywords.K_ALTER;
@ -177,6 +178,7 @@ final class AlterViewImpl extends AbstractQuery implements
accept1(ctx);
}

View File

@ -54,7 +54,8 @@ import static org.jooq.SQLDialect.H2;
// ...
// ...
import static org.jooq.SQLDialect.MARIADB;
import static org.jooq.SQLDialect.*;
import static org.jooq.SQLDialect.MYSQL;
// ...
// ...
// ...
import static org.jooq.SQLDialect.SQLITE;

View File

@ -86,6 +86,7 @@ final class BitCount extends AbstractFunction<Integer> {
// 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:

View File

@ -152,6 +152,7 @@ final class BlockImpl extends AbstractQuery implements Block {
default: {
accept0(ctx);
break;
@ -178,6 +179,7 @@ final class BlockImpl extends AbstractQuery implements Block {
case FIREBIRD:
case MARIADB:
default:

View File

@ -75,6 +75,7 @@ final class Ceil<T extends Number> extends AbstractFunction<T> {
case H2:
return DSL.field("{ceiling}({0})", getDataType(), argument);

View File

@ -94,6 +94,7 @@ final class Concat extends AbstractFunction<String> {
default:
return new Expression<String>(CONCAT, first, others);
}

View File

@ -75,6 +75,7 @@ final class ConditionAsField extends AbstractFunction<Boolean> {
case CUBRID:
case FIREBIRD:

View File

@ -68,6 +68,7 @@ final class ConstantSortField<T> extends CustomField<T> {
case POSTGRES:
case HSQLDB:
ctx.sql('(').visit(select(one())).sql(')');

View File

@ -38,6 +38,7 @@
package org.jooq.impl;
import static org.jooq.Clause.CONSTRAINT;
// ...
import static org.jooq.impl.ConstraintImpl.Action.CASCADE;
import static org.jooq.impl.ConstraintImpl.Action.NO_ACTION;
import static org.jooq.impl.ConstraintImpl.Action.RESTRICT;
@ -48,6 +49,8 @@ import static org.jooq.impl.DSL.table;
import static org.jooq.impl.Keywords.K_CHECK;
import static org.jooq.impl.Keywords.K_CONSTRAINT;
import static org.jooq.impl.Keywords.K_FOREIGN_KEY;
import static org.jooq.impl.Keywords.K_NONCLUSTERED;
import static org.jooq.impl.Keywords.K_NOT_ENFORCED;
import static org.jooq.impl.Keywords.K_ON_DELETE;
import static org.jooq.impl.Keywords.K_ON_UPDATE;
import static org.jooq.impl.Keywords.K_PRIMARY_KEY;
@ -188,14 +191,30 @@ implements
.visit(new QueryPartList<Field<?>>(unique))
.qualify(qualify)
.sql(')');
}
else if (primaryKey != null) {
ctx.visit(K_PRIMARY_KEY)
.sql(" (")
ctx.visit(K_PRIMARY_KEY);
ctx.sql(" (")
.qualify(false)
.visit(new QueryPartList<Field<?>>(primaryKey))
.qualify(qualify)
.sql(')');
}
else if (foreignKey != null) {
ctx.visit(K_FOREIGN_KEY)

View File

@ -77,6 +77,7 @@ final class Cosh extends AbstractFunction<BigDecimal> {
case CUBRID:
case HSQLDB:
case MARIADB:

View File

@ -49,6 +49,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;
@ -266,7 +267,7 @@ final class CreateIndexImpl extends AbstractQuery implements
ctx.visit(generatedName())
.sql(' ');
boolean supportsInclude = false ;
boolean supportsInclude = false ;
boolean supportsFieldsBeforeTable = false ;
QueryPartList<QueryPart> list = new QueryPartList<QueryPart>();

View File

@ -47,6 +47,7 @@ import static org.jooq.SQLDialect.FIREBIRD;
// ...
// ...
// ...
// ...
import static org.jooq.impl.Keywords.K_CREATE_SCHEMA;
import static org.jooq.impl.Keywords.K_EXEC;
import static org.jooq.impl.Keywords.K_IF_NOT_EXISTS;

View File

@ -61,6 +61,7 @@ import static org.jooq.SQLDialect.MYSQL;
// ...
import static org.jooq.SQLDialect.POSTGRES;
// ...
// ...
import static org.jooq.SQLDialect.SQLITE;
// ...
// ...

View File

@ -49,6 +49,7 @@ import static org.jooq.SQLDialect.H2;
// ...
// ...
import static org.jooq.SQLDialect.POSTGRES;
// ...
import static org.jooq.SQLDialect.SQLITE;
// ...
// ...
@ -194,6 +195,7 @@ final class CreateViewImpl<R extends Record> extends AbstractQuery implements
default:
ctx.sql(' ').visit(K_REPLACE);
break;

View File

@ -82,6 +82,7 @@ final class CurrentDate<T> extends AbstractFunction<T> {
case DERBY:

View File

@ -78,6 +78,7 @@ final class CurrentSchema extends AbstractFunction<String> {
case CUBRID:
case FIREBIRD:
case SQLITE:

View File

@ -88,6 +88,7 @@ final class CurrentTime<T> extends AbstractFunction<T> {
}
return DSL.function("current_time", getDataType());

View File

@ -82,6 +82,7 @@ final class CurrentTimestamp<T> extends AbstractFunction<T> {
case DERBY:

View File

@ -76,6 +76,7 @@ final class CurrentUser extends AbstractFunction<String> {
case DERBY:
case FIREBIRD:
case HSQLDB:

View File

@ -282,6 +282,7 @@ final class DateAdd<T> extends AbstractFunction<T> {
}

View File

@ -116,6 +116,7 @@ final class DateDiff<T> extends AbstractFunction<Integer> {
}

View File

@ -52,10 +52,11 @@ import static org.jooq.SQLDialect.HSQLDB;
// ...
// ...
import static org.jooq.SQLDialect.MARIADB;
import static org.jooq.SQLDialect.*;
import static org.jooq.SQLDialect.MYSQL;
// ...
import static org.jooq.SQLDialect.POSTGRES;
// ...
// ...
import static org.jooq.SQLDialect.SQLITE;
// ...
// ...
@ -3636,6 +3637,7 @@ public class DefaultBinding<T, U> implements Binding<T, U> {
// Most databases don't have such a type. In this case, jOOQ
// emulates the type
default: {
@ -3667,6 +3669,7 @@ public class DefaultBinding<T, U> implements Binding<T, U> {
// Most databases don't have such a type. In this case, jOOQ
// emulates the type
default:
@ -3691,6 +3694,7 @@ public class DefaultBinding<T, U> implements Binding<T, U> {
// Most databases don't have such a type. In this case, jOOQ
// emulates the type
default:

View File

@ -3767,6 +3767,7 @@ public class DefaultDSLContext extends AbstractScope implements DSLContext, Seri
default:
throw new SQLDialectNotSupportedException("identity functionality not supported by " + configuration().dialect());

View File

@ -543,6 +543,7 @@ class DefaultRenderContext extends AbstractContext<RenderContext> implements Ren
// [#5701] Tests were conducted with PostgreSQL 9.5 and pgjdbc 9.4.1209

View File

@ -46,7 +46,8 @@ import static org.jooq.SQLDialect.CUBRID;
import static org.jooq.SQLDialect.DERBY;
import static org.jooq.SQLDialect.FIREBIRD;
import static org.jooq.SQLDialect.MARIADB;
import static org.jooq.SQLDialect.*;
import static org.jooq.SQLDialect.MYSQL;
// ...
// ...
// ...
import static org.jooq.impl.DSL.name;

View File

@ -47,6 +47,7 @@ import static org.jooq.SQLDialect.FIREBIRD;
// ...
// ...
// ...
// ...
import static org.jooq.impl.Keywords.K_CASCADE;
import static org.jooq.impl.Keywords.K_DROP_SCHEMA;
import static org.jooq.impl.Keywords.K_IF_EXISTS;

View File

@ -46,6 +46,7 @@ import static org.jooq.SQLDialect.DERBY;
import static org.jooq.SQLDialect.FIREBIRD;
// ...
// ...
// ...
import static org.jooq.impl.Keywords.K_CASCADE;
import static org.jooq.impl.Keywords.K_DROP_TABLE;
import static org.jooq.impl.Keywords.K_IF_EXISTS;

View File

@ -47,6 +47,7 @@ import static org.jooq.SQLDialect.FIREBIRD;
// ...
// ...
// ...
// ...
import static org.jooq.impl.Keywords.K_DROP_VIEW;
import static org.jooq.impl.Keywords.K_IF_EXISTS;

View File

@ -125,6 +125,7 @@ final class Dual extends AbstractTable<Record> {
case H2:
case POSTGRES:
case SQLITE:

View File

@ -78,6 +78,7 @@ final class Euler extends AbstractFunction<BigDecimal> {
case CUBRID:
case DERBY:
case FIREBIRD:

View File

@ -50,6 +50,7 @@ import static org.jooq.SQLDialect.HSQLDB;
// ...
import static org.jooq.SQLDialect.POSTGRES;
// ...
// ...
import static org.jooq.SQLDialect.SQLITE;
// ...
// ...
@ -470,6 +471,7 @@ final class Expression<T> extends AbstractFunction<T> {
case POSTGRES:
@ -514,6 +516,7 @@ final class Expression<T> extends AbstractFunction<T> {
case FIREBIRD: {
if (operator == ADD)
return DSL.field("{dateadd}(day, {0}, {1})", getDataType(), rhsAsNumber(), lhs);

View File

@ -183,6 +183,7 @@ final class Extract extends AbstractFunction<Integer> {
case MARIADB:

View File

@ -94,6 +94,7 @@ final class FetchCount extends AbstractResultQuery<Record1<Integer>> {
default:
return select(count).from(query.asTable("q"));
}

View File

@ -88,6 +88,7 @@ final class FieldCondition extends AbstractCondition {
return (QueryPartInternal) condition("{0} = {1}", field, inline(true));

View File

@ -41,6 +41,7 @@ import static java.lang.Boolean.TRUE;
import static org.jooq.Clause.FIELD_ROW;
import static org.jooq.Clause.INSERT_SELECT;
import static org.jooq.Clause.INSERT_VALUES;
// ...
import static org.jooq.impl.DSL.name;
import static org.jooq.impl.DSL.table;
import static org.jooq.impl.Keywords.K_DEFAULT_VALUES;
@ -63,6 +64,7 @@ import java.util.Set;
import org.jooq.Clause;
import org.jooq.Context;
import org.jooq.Field;
import org.jooq.Param;
import org.jooq.Record;
import org.jooq.Select;
import org.jooq.Table;
@ -103,7 +105,7 @@ final class FieldMapsForInsert extends AbstractQueryPart {
}
// Single record inserts can use the standard syntax in any dialect
else if (rows == 1) {
else if (rows == 1 ) {
ctx.formatSeparator()
.start(INSERT_VALUES)
.visit(K_VALUES)
@ -157,6 +159,7 @@ final class FieldMapsForInsert extends AbstractQueryPart {
case FIREBIRD: {
@ -182,6 +185,22 @@ final class FieldMapsForInsert extends AbstractQueryPart {
}
}
final Select<Record> insertSelect() {
Select<Record> select = null;

View File

@ -78,6 +78,7 @@ final class Greatest<T> extends AbstractFunction<T> {
case DERBY: {
Field<T> first = (Field<T>) getArguments()[0];
Field<T> other = (Field<T>) getArguments()[1];

View File

@ -98,6 +98,7 @@ final class Identifiers {
// Most dialects implement the SQL standard, using double quotes

View File

@ -53,6 +53,7 @@ import static org.jooq.SQLDialect.FIREBIRD;
// ...
// ...
// ...
// ...
import static org.jooq.conf.ParamType.INDEXED;
import static org.jooq.impl.DSL.falseCondition;
import static org.jooq.impl.DSL.trueCondition;
@ -116,6 +117,7 @@ final class InCondition<T> extends AbstractCondition {
case FIREBIRD: {
ctx.sql('(')
.formatIndentStart()

View File

@ -49,7 +49,8 @@ import static org.jooq.SQLDialect.DERBY;
// ...
// ...
import static org.jooq.SQLDialect.MARIADB;
import static org.jooq.SQLDialect.*;
import static org.jooq.SQLDialect.MYSQL;
// ...
// ...
// ...
import static org.jooq.SQLDialect.SQLITE;

View File

@ -79,6 +79,7 @@ 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;

View File

@ -181,7 +181,9 @@ final class Keywords {
static final Keyword K_MODIFY = keyword("modify");
static final Keyword K_NEW_TABLE = keyword("new table");
static final Keyword K_NOCYCLE = keyword("nocycle");
static final Keyword K_NONCLUSTERED = keyword("nonclustered");
static final Keyword K_NOT = keyword("not");
static final Keyword K_NOT_ENFORCED = keyword("not enforced");
static final Keyword K_NOT_EXISTS = keyword("not exists");
static final Keyword K_NOT_IN = keyword("not in");
static final Keyword K_NOT_NULL = keyword("not null");
@ -225,6 +227,7 @@ final class Keywords {
static final Keyword K_RENAME_COLUMN = keyword("rename column");
static final Keyword K_RENAME_CONSTRAINT = keyword("rename constraint");
static final Keyword K_RENAME_INDEX = keyword("rename index");
static final Keyword K_RENAME_OBJECT = keyword("rename object");
static final Keyword K_RENAME_TABLE = keyword("rename table");
static final Keyword K_RENAME_TO = keyword("rename to");
static final Keyword K_REPLACE = keyword("replace");

View File

@ -77,6 +77,7 @@ final class Least<T> extends AbstractFunction<T> {
case DERBY: {
Field<T> first = (Field<T>) getArguments()[0];
Field<T> other = (Field<T>) getArguments()[1];

View File

@ -80,6 +80,7 @@ final class Left extends AbstractFunction<String> {
case CUBRID:
case FIREBIRD:
case H2:

View File

@ -286,6 +286,7 @@ final class Limit extends AbstractQueryPart {
// [#4785] OFFSET cannot be without LIMIT

View File

@ -72,7 +72,8 @@ final class Ln extends AbstractFunction<BigDecimal> {
@Override
final Field<BigDecimal> getFunction0(Configuration configuration) {
if (base == null) {
switch (configuration.dialect().family()) {
switch (configuration.family()) {
@ -89,7 +90,8 @@ final class Ln extends AbstractFunction<BigDecimal> {
}
}
else {
switch (configuration.dialect().family()) {
switch (configuration.family()) {

View File

@ -84,6 +84,7 @@ final class Lpad extends AbstractFunction<String> {
// This beautiful expression was contributed by "Ludo", here:
// http://stackoverflow.com/questions/6576343/how-to-simulate-lpad-rpad-with-sqlite
case SQLITE: {

View File

@ -50,6 +50,7 @@ import static org.jooq.Clause.MERGE_WHEN_NOT_MATCHED_THEN_INSERT;
import static org.jooq.Clause.MERGE_WHERE;
// ...
// ...
// ...
import static org.jooq.impl.DSL.condition;
import static org.jooq.impl.DSL.exists;
import static org.jooq.impl.DSL.insertInto;
@ -1496,7 +1497,8 @@ implements
boolean onParentheses = false ;
boolean onParentheses = false ;
ctx.end(MERGE_USING)
.formatSeparator()
.start(MERGE_ON)
@ -1585,6 +1587,7 @@ implements
}
@Override

View File

@ -75,6 +75,7 @@ final class Mod<T> extends AbstractFunction<T> {
case SQLITE:
return new Expression<T>(MODULO, arg1, arg2);
}

View File

@ -75,6 +75,7 @@ final class NotField extends AbstractField<Boolean> {
ctx.visit(DSL.field(not(condition(field))));
break;

View File

@ -68,6 +68,7 @@ final class NullStatement extends AbstractStatement {
default:
ctx.visit(K_NULL);
break;

View File

@ -79,6 +79,7 @@ final class Position extends AbstractFunction<Integer> {
default:
return DSL.position(DSL.substring(in, startIndex), search).add(startIndex).sub(one());
}
@ -103,6 +104,7 @@ final class Position extends AbstractFunction<Integer> {
case SQLITE:
return DSL.field("{instr}({0}, {1})", SQLDataType.INTEGER, in, search);

View File

@ -126,6 +126,7 @@ final class RegexpLike extends AbstractCondition {
case DERBY:
case FIREBIRD:
default: {

View File

@ -88,6 +88,7 @@ final class Repeat extends AbstractFunction<String> {
default:
return function("repeat", SQLDataType.VARCHAR, string, count);
}

View File

@ -85,6 +85,7 @@ final class Replace extends AbstractFunction<String> {
case FIREBIRD:

View File

@ -71,6 +71,7 @@ final class Reverse extends AbstractFunction<String> {
case CUBRID:
case HSQLDB:
case POSTGRES:

View File

@ -82,6 +82,7 @@ final class Right extends AbstractFunction<String> {
case CUBRID:
case FIREBIRD:
case H2:

View File

@ -103,24 +103,21 @@ final class Round<T extends Number> extends AbstractFunction<T> {
// There's no function round(double precision, integer) in Postgres
case POSTGRES: {
if (decimals == 0) {
if (decimals == 0)
return function("round", getDataType(), argument);
}
else {
else
return function("round", getDataType(), argument.cast(BigDecimal.class), val(decimals));
}
}
// This is the optimal implementation by most RDBMS
default: {
if (decimals == 0) {
if (decimals == 0)
return function("round", getDataType(), argument);
}
else {
else
return function("round", getDataType(), argument, val(decimals));
}
}
}
}

View File

@ -57,6 +57,7 @@ import static org.jooq.SQLDialect.MARIADB;
import static org.jooq.SQLDialect.MYSQL;
// ...
// ...
// ...
import static org.jooq.SQLDialect.SQLITE;
// ...
// ...
@ -72,14 +73,6 @@ import java.util.EnumSet;
import javax.annotation.Generated;
import org.jooq.BetweenAndStep1;
import org.jooq.BetweenAndStep2;
import org.jooq.BetweenAndStep3;
import org.jooq.BetweenAndStep4;
import org.jooq.BetweenAndStep5;
import org.jooq.BetweenAndStep6;
import org.jooq.BetweenAndStep7;
import org.jooq.BetweenAndStep8;
import org.jooq.BetweenAndStep9;
import org.jooq.BetweenAndStep10;
import org.jooq.BetweenAndStep11;
import org.jooq.BetweenAndStep12;
@ -90,11 +83,18 @@ import org.jooq.BetweenAndStep16;
import org.jooq.BetweenAndStep17;
import org.jooq.BetweenAndStep18;
import org.jooq.BetweenAndStep19;
import org.jooq.BetweenAndStep2;
import org.jooq.BetweenAndStep20;
import org.jooq.BetweenAndStep21;
import org.jooq.BetweenAndStep22;
import org.jooq.BetweenAndStep3;
import org.jooq.BetweenAndStep4;
import org.jooq.BetweenAndStep5;
import org.jooq.BetweenAndStep6;
import org.jooq.BetweenAndStep7;
import org.jooq.BetweenAndStep8;
import org.jooq.BetweenAndStep9;
import org.jooq.BetweenAndStepN;
import org.jooq.BindContext;
import org.jooq.Clause;
import org.jooq.Condition;
import org.jooq.Configuration;
@ -103,14 +103,6 @@ import org.jooq.Field;
import org.jooq.QueryPartInternal;
import org.jooq.Record;
import org.jooq.Record1;
import org.jooq.Record2;
import org.jooq.Record3;
import org.jooq.Record4;
import org.jooq.Record5;
import org.jooq.Record6;
import org.jooq.Record7;
import org.jooq.Record8;
import org.jooq.Record9;
import org.jooq.Record10;
import org.jooq.Record11;
import org.jooq.Record12;
@ -121,19 +113,19 @@ import org.jooq.Record16;
import org.jooq.Record17;
import org.jooq.Record18;
import org.jooq.Record19;
import org.jooq.Record2;
import org.jooq.Record20;
import org.jooq.Record21;
import org.jooq.Record22;
import org.jooq.Record3;
import org.jooq.Record4;
import org.jooq.Record5;
import org.jooq.Record6;
import org.jooq.Record7;
import org.jooq.Record8;
import org.jooq.Record9;
import org.jooq.Row;
import org.jooq.Row1;
import org.jooq.Row2;
import org.jooq.Row3;
import org.jooq.Row4;
import org.jooq.Row5;
import org.jooq.Row6;
import org.jooq.Row7;
import org.jooq.Row8;
import org.jooq.Row9;
import org.jooq.Row10;
import org.jooq.Row11;
import org.jooq.Row12;
@ -144,9 +136,17 @@ import org.jooq.Row16;
import org.jooq.Row17;
import org.jooq.Row18;
import org.jooq.Row19;
import org.jooq.Row2;
import org.jooq.Row20;
import org.jooq.Row21;
import org.jooq.Row22;
import org.jooq.Row3;
import org.jooq.Row4;
import org.jooq.Row5;
import org.jooq.Row6;
import org.jooq.Row7;
import org.jooq.Row8;
import org.jooq.Row9;
import org.jooq.RowN;
import org.jooq.SQLDialect;

View File

@ -56,6 +56,7 @@ import static org.jooq.SQLDialect.FIREBIRD;
// ...
// ...
// ...
// ...
import static org.jooq.SQLDialect.SQLITE;
// ...
// ...

View File

@ -50,6 +50,7 @@ import static org.jooq.SQLDialect.DERBY;
import static org.jooq.SQLDialect.FIREBIRD;
// ...
// ...
// ...
import static org.jooq.SQLDialect.SQLITE;
// ...
// ...

View File

@ -49,7 +49,8 @@ import static org.jooq.SQLDialect.DERBY;
// ...
// ...
import static org.jooq.SQLDialect.MARIADB;
import static org.jooq.SQLDialect.*;
import static org.jooq.SQLDialect.MYSQL;
// ...
// ...
// ...
import static org.jooq.SQLDialect.SQLITE;

View File

@ -52,7 +52,8 @@ import static org.jooq.SQLDialect.HSQLDB;
// ...
// ...
import static org.jooq.SQLDialect.MARIADB;
import static org.jooq.SQLDialect.*;
import static org.jooq.SQLDialect.MYSQL;
// ...
// ...
import static org.jooq.SQLDialect.SQLITE;
// ...

View File

@ -52,7 +52,8 @@ import static org.jooq.SQLDialect.HSQLDB;
// ...
// ...
import static org.jooq.SQLDialect.MARIADB;
import static org.jooq.SQLDialect.*;
import static org.jooq.SQLDialect.MYSQL;
// ...
import static org.jooq.SQLDialect.SQLITE;
// ...
// ...

View File

@ -83,10 +83,9 @@ final class Rpad extends AbstractFunction<String> {
// This beautiful expression was contributed by "Ludo", here:
// http://stackoverflow.com/questions/6576343/how-to-simulate-lpad-rpad-with-sqlite
case SQLITE: {
case SQLITE:
return DSL.field(
"{0} || substr(" +
"replace(" +
@ -101,17 +100,14 @@ final class Rpad extends AbstractFunction<String> {
")",
String.class,
field, length, character);
}
// According to the Firebird documentation, LPAD outcomes should be
// cast to truncate large results...
case FIREBIRD: {
case FIREBIRD:
return DSL.field("cast(rpad({0}, {1}, {2}) as varchar(4000))", SQLDataType.VARCHAR, field, length, character);
}
default: {
default:
return function("rpad", SQLDataType.VARCHAR, field, length, character);
}
}
}
}

View File

@ -79,6 +79,7 @@ import org.jooq.util.mysql.MySQLDataType;
// ...
import org.jooq.util.postgres.PostgresDataType;
// ...
// ...
import org.jooq.util.sqlite.SQLiteDataType;
// ...
// ...
@ -600,6 +601,7 @@ public final class SQLDataType {
Class.forName(CUBRIDDataType.class.getName());
Class.forName(DerbyDataType.class.getName());
Class.forName(FirebirdDataType.class.getName());

View File

@ -76,6 +76,7 @@ import static org.jooq.SQLDialect.MYSQL;
// ...
import static org.jooq.SQLDialect.POSTGRES;
// ...
// ...
import static org.jooq.SQLDialect.SQLITE;
// ...
// ...
@ -213,6 +214,10 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> imp
private final WithImpl with;
private final SelectFieldList<SelectFieldOrAsterisk> select;
private Table<?> into;
@ -614,6 +619,7 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> imp
case CUBRID:
@ -922,7 +928,8 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> imp
// [#5068] Don't rely on nested query's ordering in case an operation
// like DISTINCT or JOIN produces hashing.
if (!ctx.subquery())
// [#7427] Don't order if not strictly required.
if (!ctx.subquery() && !getOrderBy().isEmpty())
ctx.formatSeparator()
.visit(K_ORDER_BY)
.sql(' ')
@ -1620,6 +1627,11 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> imp
@ -2067,6 +2079,7 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> imp
default:
result.add(DSL.field("({select} 0)").asc());
break;

View File

@ -37,6 +37,7 @@
*/
package org.jooq.impl;
// ...
import static org.jooq.impl.DSL.function;
import static org.jooq.impl.DSL.one;
import static org.jooq.impl.DSL.two;
@ -77,6 +78,7 @@ final class Sinh extends AbstractFunction<BigDecimal> {
case CUBRID:
case HSQLDB:
case MARIADB:

View File

@ -122,6 +122,7 @@ final class SortFieldImpl<T> extends AbstractQueryPart implements SortField<T> {
// These OSS dialects don't support this syntax at all
case CUBRID:
case MARIADB:

View File

@ -37,6 +37,8 @@
*/
package org.jooq.impl;
// ...
import org.jooq.Configuration;
import org.jooq.Field;
import org.jooq.QueryPart;
@ -84,6 +86,7 @@ final class Space extends AbstractFunction<String> {
case CUBRID:
case MARIADB:
case MYSQL:

View File

@ -68,12 +68,10 @@ final class Substring extends AbstractFunction<String> {
case FIREBIRD: {
if (getArguments().length == 2) {
if (getArguments().length == 2)
return DSL.field("{substring}({0} {from} {1})", SQLDataType.VARCHAR, getArguments());
}
else {
else
return DSL.field("{substring}({0} {from} {1} {for} {2})", SQLDataType.VARCHAR, getArguments());
}
}
@ -108,9 +106,6 @@ final class Substring extends AbstractFunction<String> {

View File

@ -42,7 +42,8 @@ import static java.lang.Boolean.TRUE;
import static org.jooq.SQLDialect.DERBY;
import static org.jooq.SQLDialect.H2;
import static org.jooq.SQLDialect.MARIADB;
import static org.jooq.SQLDialect.*;
import static org.jooq.SQLDialect.MYSQL;
// ...
// ...
import static org.jooq.conf.SettingsTools.updatablePrimaryKeys;
import static org.jooq.impl.RecordDelegate.delegate;

View File

@ -37,6 +37,7 @@
*/
package org.jooq.impl;
// ...
import static org.jooq.impl.DSL.function;
import static org.jooq.impl.DSL.one;
import static org.jooq.impl.DSL.two;
@ -77,6 +78,7 @@ final class Tanh extends AbstractFunction<BigDecimal> {
case CUBRID:
case HSQLDB:
case MARIADB:

View File

@ -65,6 +65,7 @@ enum Term {
return "atan2";
}
},
@ -89,6 +90,7 @@ enum Term {
case DERBY:
case SQLITE:
return "8 * length";
@ -113,6 +115,7 @@ enum Term {
case DERBY:
case SQLITE:
return "length";
@ -186,6 +189,7 @@ enum Term {
case DERBY:
case SQLITE:
return "length";
@ -222,6 +226,7 @@ enum Term {
return "stddev_pop";
}
},
@ -242,6 +247,7 @@ enum Term {
return "stddev_samp";
}
},
@ -262,6 +268,7 @@ enum Term {
return "var_pop";
}
},
@ -282,6 +289,7 @@ enum Term {
return "var_samp";
}
},

View File

@ -37,6 +37,7 @@
*/
package org.jooq.impl;
// ...
import static org.jooq.impl.DSL.function;
import static org.jooq.impl.SQLDataType.INTEGER;
@ -97,6 +98,7 @@ final class TimestampDiff extends AbstractFunction<DayToSecond> {
case POSTGRES:

View File

@ -51,6 +51,7 @@ import static org.jooq.SQLDialect.MARIADB;
import static org.jooq.SQLDialect.MYSQL;
// ...
import static org.jooq.SQLDialect.POSTGRES;
// ...
import static org.jooq.SQLDialect.SQLITE;
// ...
import static org.jooq.conf.BackslashEscaping.DEFAULT;
@ -3359,6 +3360,7 @@ final class Tools {
}
@ -3886,6 +3888,7 @@ final class Tools {
case FIREBIRD: {
@ -4076,6 +4079,7 @@ final class Tools {
case FIREBIRD: {
@ -4144,6 +4148,7 @@ final class Tools {
case CUBRID: ctx.sql(' ').visit(K_AUTO_INCREMENT); break;
case DERBY: ctx.sql(' ').visit(K_GENERATED_BY_DEFAULT_AS_IDENTITY); break;
case HSQLDB: ctx.sql(' ').visit(K_GENERATED_BY_DEFAULT_AS_IDENTITY).sql('(').visit(K_START_WITH).sql(" 1)"); break;

View File

@ -74,6 +74,7 @@ final class Trim extends AbstractFunction<String> {
return function("trim", SQLDataType.VARCHAR, argument);
}
}

View File

@ -38,6 +38,7 @@
package org.jooq.impl;
import static java.math.BigDecimal.TEN;
// ...
import static org.jooq.impl.DSL.inline;
import static org.jooq.impl.DSL.keyword;
import static org.jooq.impl.DSL.one;
@ -127,6 +128,7 @@ final class Trunc<T> extends AbstractFunction<T> {
case CUBRID:
case HSQLDB:
default:

View File

@ -54,6 +54,7 @@ import static org.jooq.SQLDialect.HSQLDB;
import static org.jooq.SQLDialect.POSTGRES;
import static org.jooq.SQLDialect.POSTGRES_10;
// ...
// ...
import static org.jooq.conf.SettingsTools.getExecuteUpdateWithoutWhere;
import static org.jooq.impl.DSL.select;
import static org.jooq.impl.Keywords.K_FROM;
@ -524,6 +525,7 @@ final class UpdateQueryImpl<R extends Record> extends AbstractStoreQuery<R> impl
)
.visit(table)
.declareTables(declareTables)

View File

@ -108,6 +108,7 @@ final class Values<R extends Record> extends AbstractTable<R> {
case FIREBIRD:
case MARIADB:
case MYSQL: {

View File

@ -41,6 +41,7 @@ import static org.jooq.Clause.WITH;
// ...
// ...
// ...
// ...
import static org.jooq.impl.DSL.count;
import static org.jooq.impl.DSL.name;
import static org.jooq.impl.DSL.one;