blob: b22f8fb466ec9f4dd3a4df6abb88350a5e1b5ed1 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.calcite.sql;
import org.apache.calcite.sql.dialect.AccessSqlDialect;
import org.apache.calcite.sql.dialect.AnsiSqlDialect;
import org.apache.calcite.sql.dialect.BigQuerySqlDialect;
import org.apache.calcite.sql.dialect.CalciteSqlDialect;
import org.apache.calcite.sql.dialect.ClickHouseSqlDialect;
import org.apache.calcite.sql.dialect.Db2SqlDialect;
import org.apache.calcite.sql.dialect.DerbySqlDialect;
import org.apache.calcite.sql.dialect.ExasolSqlDialect;
import org.apache.calcite.sql.dialect.FirebirdSqlDialect;
import org.apache.calcite.sql.dialect.FireboltSqlDialect;
import org.apache.calcite.sql.dialect.H2SqlDialect;
import org.apache.calcite.sql.dialect.HiveSqlDialect;
import org.apache.calcite.sql.dialect.HsqldbSqlDialect;
import org.apache.calcite.sql.dialect.InfobrightSqlDialect;
import org.apache.calcite.sql.dialect.InformixSqlDialect;
import org.apache.calcite.sql.dialect.IngresSqlDialect;
import org.apache.calcite.sql.dialect.InterbaseSqlDialect;
import org.apache.calcite.sql.dialect.JethroDataSqlDialect;
import org.apache.calcite.sql.dialect.LucidDbSqlDialect;
import org.apache.calcite.sql.dialect.MssqlSqlDialect;
import org.apache.calcite.sql.dialect.MysqlSqlDialect;
import org.apache.calcite.sql.dialect.NeoviewSqlDialect;
import org.apache.calcite.sql.dialect.NetezzaSqlDialect;
import org.apache.calcite.sql.dialect.OracleSqlDialect;
import org.apache.calcite.sql.dialect.ParaccelSqlDialect;
import org.apache.calcite.sql.dialect.PhoenixSqlDialect;
import org.apache.calcite.sql.dialect.PostgresqlSqlDialect;
import org.apache.calcite.sql.dialect.PrestoSqlDialect;
import org.apache.calcite.sql.dialect.RedshiftSqlDialect;
import org.apache.calcite.sql.dialect.SnowflakeSqlDialect;
import org.apache.calcite.sql.dialect.SparkSqlDialect;
import org.apache.calcite.sql.dialect.StarRocksSqlDialect;
import org.apache.calcite.sql.dialect.SybaseSqlDialect;
import org.apache.calcite.sql.dialect.TeradataSqlDialect;
import org.apache.calcite.sql.dialect.VerticaSqlDialect;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.Locale;
/**
* The default implementation of a <code>SqlDialectFactory</code>.
*/
public class SqlDialectFactoryImpl implements SqlDialectFactory {
public static final SqlDialectFactoryImpl INSTANCE = new SqlDialectFactoryImpl();
private final JethroDataSqlDialect.JethroInfoCache jethroCache =
JethroDataSqlDialect.createCache();
@Override public SqlDialect create(DatabaseMetaData databaseMetaData) {
SqlDialect.Context c = SqlDialects.createContext(databaseMetaData);
String databaseProductName = c.databaseProductName();
try {
if (databaseProductName == null) {
databaseProductName = databaseMetaData.getDatabaseProductName();
}
} catch (SQLException e) {
throw new RuntimeException("while detecting database product", e);
}
final String upperProductName =
databaseProductName.toUpperCase(Locale.ROOT).trim();
switch (upperProductName) {
case "ACCESS":
return new AccessSqlDialect(c);
case "APACHE DERBY":
return new DerbySqlDialect(c);
case "CLICKHOUSE":
return new ClickHouseSqlDialect(c);
case "DBMS:CLOUDSCAPE":
return new DerbySqlDialect(c);
case "EXASOL":
return new ExasolSqlDialect(c);
case "FIREBOLT":
return new FireboltSqlDialect(c);
case "HIVE":
return new HiveSqlDialect(c);
case "INGRES":
return new IngresSqlDialect(c);
case "INTERBASE":
return new InterbaseSqlDialect(c);
case "JETHRODATA":
return new JethroDataSqlDialect(
c.withJethroInfo(jethroCache.get(databaseMetaData)));
case "LUCIDDB":
return new LucidDbSqlDialect(c);
case "ORACLE":
return new OracleSqlDialect(c);
case "PHOENIX":
return new PhoenixSqlDialect(c);
case "PRESTO":
case "AWS.ATHENA":
return new PrestoSqlDialect(c);
case "MYSQL (INFOBRIGHT)":
return new InfobrightSqlDialect(c);
case "MYSQL":
return new MysqlSqlDialect(
c.withDataTypeSystem(MysqlSqlDialect.MYSQL_TYPE_SYSTEM));
case "REDSHIFT":
return new RedshiftSqlDialect(
c.withDataTypeSystem(RedshiftSqlDialect.TYPE_SYSTEM));
case "SNOWFLAKE":
return new SnowflakeSqlDialect(c);
case "SPARK":
return new SparkSqlDialect(c);
default:
break;
}
// Now the fuzzy matches.
if (upperProductName.startsWith("DB2")) {
return new Db2SqlDialect(c);
} else if (upperProductName.contains("FIREBIRD")) {
return new FirebirdSqlDialect(c);
} else if (upperProductName.contains("FIREBOLT")) {
return new FireboltSqlDialect(c);
} else if (upperProductName.contains("GOOGLE BIGQUERY")
|| upperProductName.contains("GOOGLE BIG QUERY")) {
return new BigQuerySqlDialect(c);
} else if (upperProductName.startsWith("INFORMIX")) {
return new InformixSqlDialect(c);
} else if (upperProductName.contains("NETEZZA")) {
return new NetezzaSqlDialect(c);
} else if (upperProductName.contains("PARACCEL")) {
return new ParaccelSqlDialect(c);
} else if (upperProductName.startsWith("HP NEOVIEW")) {
return new NeoviewSqlDialect(c);
} else if (upperProductName.contains("POSTGRE")) {
return new PostgresqlSqlDialect(
c.withDataTypeSystem(PostgresqlSqlDialect.POSTGRESQL_TYPE_SYSTEM));
} else if (upperProductName.contains("SQL SERVER")) {
return new MssqlSqlDialect(c);
} else if (upperProductName.contains("SYBASE")) {
return new SybaseSqlDialect(c);
} else if (upperProductName.contains("TERADATA")) {
return new TeradataSqlDialect(c);
} else if (upperProductName.contains("HSQL")) {
return new HsqldbSqlDialect(c);
} else if (upperProductName.contains("H2")) {
return new H2SqlDialect(c);
} else if (upperProductName.contains("VERTICA")) {
return new VerticaSqlDialect(c);
} else if (upperProductName.contains("SNOWFLAKE")) {
return new SnowflakeSqlDialect(c);
} else if (upperProductName.contains("SPARK")) {
return new SparkSqlDialect(c);
} else {
return new AnsiSqlDialect(c);
}
}
/** Returns a basic dialect for a given product, or null if none is known. */
static @Nullable SqlDialect simple(SqlDialect.DatabaseProduct databaseProduct) {
switch (databaseProduct) {
case ACCESS:
return AccessSqlDialect.DEFAULT;
case BIG_QUERY:
return BigQuerySqlDialect.DEFAULT;
case CALCITE:
return CalciteSqlDialect.DEFAULT;
case CLICKHOUSE:
return ClickHouseSqlDialect.DEFAULT;
case DB2:
return Db2SqlDialect.DEFAULT;
case DERBY:
return DerbySqlDialect.DEFAULT;
case EXASOL:
return ExasolSqlDialect.DEFAULT;
case FIREBIRD:
return FirebirdSqlDialect.DEFAULT;
case FIREBOLT:
return FireboltSqlDialect.DEFAULT;
case H2:
return H2SqlDialect.DEFAULT;
case HIVE:
return HiveSqlDialect.DEFAULT;
case HSQLDB:
return HsqldbSqlDialect.DEFAULT;
case INFOBRIGHT:
return InfobrightSqlDialect.DEFAULT;
case INFORMIX:
return InformixSqlDialect.DEFAULT;
case INGRES:
return IngresSqlDialect.DEFAULT;
case INTERBASE:
return InterbaseSqlDialect.DEFAULT;
case JETHRO:
throw new RuntimeException("Jethro does not support simple creation");
case LUCIDDB:
return LucidDbSqlDialect.DEFAULT;
case MSSQL:
return MssqlSqlDialect.DEFAULT;
case MYSQL:
return MysqlSqlDialect.DEFAULT;
case NEOVIEW:
return NeoviewSqlDialect.DEFAULT;
case NETEZZA:
return NetezzaSqlDialect.DEFAULT;
case ORACLE:
return OracleSqlDialect.DEFAULT;
case PARACCEL:
return ParaccelSqlDialect.DEFAULT;
case PHOENIX:
return PhoenixSqlDialect.DEFAULT;
case POSTGRESQL:
return PostgresqlSqlDialect.DEFAULT;
case PRESTO:
return PrestoSqlDialect.DEFAULT;
case REDSHIFT:
return RedshiftSqlDialect.DEFAULT;
case SNOWFLAKE:
return SnowflakeSqlDialect.DEFAULT;
case SPARK:
return SparkSqlDialect.DEFAULT;
case STARROCKS:
return StarRocksSqlDialect.DEFAULT;
case SYBASE:
return SybaseSqlDialect.DEFAULT;
case TERADATA:
return TeradataSqlDialect.DEFAULT;
case VERTICA:
return VerticaSqlDialect.DEFAULT;
case SQLSTREAM:
case UNKNOWN:
default:
return null;
}
}
}