/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
*
* Licensed 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.jkiss.dbeaver.ext.oracle.model;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.model.data.DBDBinaryFormatter;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCDatabaseMetaData;
import org.jkiss.dbeaver.model.impl.data.formatters.BinaryFormatterHex;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSource;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCSQLDialect;
import org.jkiss.dbeaver.model.impl.sql.BasicSQLDialect;
import org.jkiss.dbeaver.model.sql.SQLConstants;
import org.jkiss.utils.ArrayUtils;
import java.util.Arrays;
/**
* Oracle SQL dialect
*/
class OracleSQLDialect extends JDBCSQLDialect {
public static final String[] EXEC_KEYWORDS = new String[]{ "call" };
public static final String[] ORACLE_NON_TRANSACTIONAL_KEYWORDS = ArrayUtils.concatArrays(
BasicSQLDialect.NON_TRANSACTIONAL_KEYWORDS,
new String[]{
"CREATE", "ALTER", "DROP",
"ANALYZE", "VALIDATE"}
);
public static final String[][] ORACLE_BEGIN_END_BLOCK = new String[][]{
{SQLConstants.BLOCK_BEGIN, SQLConstants.BLOCK_END},
{"IF", SQLConstants.BLOCK_END}
};
public static final String[] ADVANCED_KEYWORDS = {
"PACKAGE",
"FUNCTION",
"TYPE",
"TRIGGER",
"MATERIALIZED",
"IF",
"EACH",
"RETURN",
"WRAPPED",
"AFTER",
"BEFORE",
"DATABASE",
"ANALYZE",
"VALIDATE",
"STRUCTURE",
"COMPUTE",
"STATISTICS",
"LOOP",
"WHILE",
"BULK",
"ELSIF",
"EXIT",
};
public OracleSQLDialect() {
super("Oracle");
}
public void initDriverSettings(JDBCDataSource dataSource, JDBCDatabaseMetaData metaData) {
super.initDriverSettings(dataSource, metaData);
addFunctions(
Arrays.asList(
"SUBSTR", "APPROX_COUNT_DISTINCT",
"REGEXP_SUBSTR", "REGEXP_INSTR", "REGEXP_REPLACE", "REGEXP_LIKE",
// Additions from #323
//Number Functions:
"BITAND",
"COSH",
"NANVL",
"REMAINDER",
"SINH",
"TANH",
"TRUNC",
//Character Functions Returning Character Values:
"CHR",
"INITCAP",
"LPAD",
"NLS_INITCAP",
"NLS_LOWER",
"NLSSORT",
"NLS_UPPER",
"RPAD",
"REVERSE",
"SUBSTRB",
"SUBSTRC",
"SUBSTR2",
"SUBSTR4",
// NLS Character Functions:
"NLS_CHARSET_DECL_LEN",
"NLS_CHARSET_ID",
"NLS_CHARSET_NAME",
//Character Functions Returning Number VALUES:
"INSTR",
"INSTRB",
"INSTRC",
"INSTR2",
"INSTR4",
"LENGTHB",
//Datetime Functions:
"ADD_MONTHS",
"DBTIMEZONE",
"FROM_TZ",
"LAST_DAY",
"MONTHS_BETWEEN",
"NEW_TIME",
"NEXT_DAY",
"NUMTODSINTERVAL",
"NUMTOYMINTERVAL",
"SESSIONTIMEZONE",
"SYS_EXTRACT_UTC",
"SYSDATE",
"SYSTIMESTAMP",
"TO_CHAR",
"TO_TIMESTAMP",
"TO_TIMESTAMP_TZ",
"TO_DSINTERVAL",
"TO_YMINTERVAL",
"TRUNC",
"TZ_OFFSET",
//General Comparison Functions:
"GREATEST",
"LEAST",
//Conversion Functions:
"ASCIISTR",
"BIN_TO_NUM",
"CHARTOROWID",
"COMPOSE",
"DECOMPOSE",
"HEXTORAW",
"NUMTODSINTERVAL",
"NUMTOYMINTERVAL",
"RAWTOHEX",
"RAWTONHEX",
"ROWIDTOCHAR",
"ROWIDTONCHAR",
"SCN_TO_TIMESTAMP",
"TIMESTAMP_TO_SCN",
"TO_BINARY_DOUBLE",
"TO_BINARY_FLOAT",
"TO_CHAR",
"TO_CLOB",
"TO_DATE",
"TO_DSINTERVAL",
"TO_LOB",
"TO_MULTI_BYTE",
"TO_NCHAR",
"TO_NCLOB",
"TO_NUMBER",
"TO_DSINTERVAL",
"TO_SINGLE_BYTE",
"TO_TIMESTAMP",
"TO_TIMESTAMP_TZ",
"TO_YMINTERVAL",
"TO_YMINTERVAL",
"UNISTR",
//Large Object Functions:
"BFILENAME",
"EMPTY_BLOB",
"EMPTY_CLOB",
//Collection Functions:
"POWERMULTISET",
"POWERMULTISET_BY_CARDINALITY",
//Hierarchical FUNCTION:
"SYS_CONNECT_BY_PATH",
//Data Mining Functions:
"CLUSTER_ID",
"CLUSTER_PROBABILITY",
"CLUSTER_SET",
"FEATURE_ID",
"FEATURE_SET",
"FEATURE_VALUE",
"PREDICTION",
"PREDICTION_COST",
"PREDICTION_DETAILS",
"PREDICTION_PROBABILITY",
"PREDICTION_SET",
//XML Functions:
"APPENDCHILDXML",
"DELETEXML",
"DEPTH",
"EXISTSNODE",
"EXTRACTVALUE",
"INSERTCHILDXML",
"INSERTXMLBEFORE",
"PATH",
"SYS_DBURIGEN",
"SYS_XMLAGG",
"SYS_XMLGEN",
"UPDATEXML",
"XMLAGG",
"XMLCDATA",
"XMLCOLATTVAL",
"XMLCOMMENT",
"XMLCONCAT",
"XMLFOREST",
"XMLPARSE",
"XMLPI",
"XMLQUERY",
"XMLROOT",
"XMLSEQUENCE",
"XMLSERIALIZE",
"XMLTABLE",
"XMLTRANSFORM",
//Encoding and Decoding Functions:
"DECODE",
"DUMP",
"ORA_HASH",
"VSIZE",
//NULL-Related Functions:
"LNNVL",
"NVL",
"NVL2",
//Environment and Identifier Functions:
"SYS_CONTEXT",
"SYS_GUID",
"SYS_TYPEID",
"UID",
"USERENV",
//Aggregate Functions:
"CORR_S",
"CORR_K",
"FIRST",
"GROUP_ID",
"GROUPING_ID",
"LAST",
"MEDIAN",
"STATS_BINOMIAL_TEST",
"STATS_CROSSTAB",
"STATS_F_TEST",
"STATS_KS_TEST",
"STATS_MODE",
"STATS_MW_TEST",
"STATS_ONE_WAY_ANOVA",
"STATS_T_TEST_ONE",
"STATS_T_TEST_PAIRED",
"STATS_T_TEST_INDEP",
"STATS_T_TEST_INDEPU",
"STATS_WSR_TEST",
"STDDEV",
"VARIANCE",
//Analytic Functions:
"FIRST",
"FIRST_VALUE",
"LAG",
"LAST",
"LAST_VALUE",
"LEAD",
"NTILE",
"RATIO_TO_REPORT",
"STDDEV",
"VARIANCE",
//Object Reference Functions:
"MAKE_REF",
"REFTOHEX",
//Model Functions:
"CV",
"ITERATION_NUMBER",
"PRESENTNNV",
"PRESENTV",
"PREVIOUS"
));
removeSQLKeyword("SYSTEM");
for (String kw : ADVANCED_KEYWORDS) {
addSQLKeyword(kw);
}
}
@Override
public String[][] getBlockBoundStrings() {
return ORACLE_BEGIN_END_BLOCK;
}
@Override
public String getBlockHeaderString() {
return "DECLARE";
}
@NotNull
@Override
public String[] getExecuteKeywords() {
return EXEC_KEYWORDS;
}
@NotNull
@Override
public MultiValueInsertMode getMultiValueInsertMode() {
return MultiValueInsertMode.GROUP_ROWS;
}
@Override
public boolean supportsAliasInSelect() {
return true;
}
@Override
public boolean supportsAliasInUpdate() {
return true;
}
@Override
public boolean isDelimiterAfterBlock() {
return true;
}
@NotNull
@Override
public DBDBinaryFormatter getNativeBinaryFormatter() {
return BinaryFormatterHex.INSTANCE;
}
@Nullable
@Override
public String getDualTableName() {
return "DUAL";
}
@NotNull
@Override
protected String[] getNonTransactionKeywords() {
return ORACLE_NON_TRANSACTIONAL_KEYWORDS;
}
}