use of org.jkiss.dbeaver.model.sql.SQLDialect in project dbeaver by serge-rider.
the class GroupingResultsContainer method rebuildGrouping.
public void rebuildGrouping() throws DBException {
if (groupAttributes.isEmpty() || groupFunctions.isEmpty()) {
groupingViewer.showEmptyPresentation();
return;
}
DBCStatistics statistics = presentation.getController().getModel().getStatistics();
if (statistics == null) {
throw new DBException("No main query - can't perform grouping");
}
DBPDataSource dataSource = dataContainer.getDataSource();
if (dataSource == null) {
throw new DBException("No active datasource");
}
SQLDialect dialect = SQLUtils.getDialectFromDataSource(dataSource);
SQLSyntaxManager syntaxManager = new SQLSyntaxManager();
syntaxManager.init(dialect, presentation.getController().getPreferenceStore());
String queryText = statistics.getQueryText();
if (queryText == null || queryText.isEmpty()) {
DBSDataContainer dataContainer = presentation.getController().getDataContainer();
if (dataContainer != null) {
queryText = dataContainer.getName();
} else {
throw new DBException("Empty data container");
}
}
for (String delimiter : syntaxManager.getStatementDelimiters()) {
while (queryText.endsWith(delimiter)) {
queryText = queryText.substring(0, queryText.length() - delimiter.length());
}
}
StringBuilder sql = new StringBuilder();
sql.append("SELECT ");
for (int i = 0; i < groupAttributes.size(); i++) {
if (i > 0)
sql.append(", ");
sql.append(DBUtils.getQuotedIdentifier(dataSource, groupAttributes.get(i)));
}
for (String func : groupFunctions) {
sql.append(", ").append(func);
}
sql.append(" FROM (\n");
sql.append(queryText);
sql.append(") src");
sql.append("\nGROUP BY ");
for (int i = 0; i < groupAttributes.size(); i++) {
if (i > 0)
sql.append(", ");
sql.append(DBUtils.getQuotedIdentifier(dataSource, groupAttributes.get(i)));
}
boolean isDefaultGrouping = groupFunctions.size() == 1 && groupFunctions.get(0).equals(DEFAULT_FUNCTION);
boolean isShowDuplicatesOnly = dataSource.getContainer().getPreferenceStore().getBoolean(ResultSetPreferences.RS_GROUPING_SHOW_DUPLICATES_ONLY);
if (isDefaultGrouping && isShowDuplicatesOnly) {
sql.append("\nHAVING ").append(DEFAULT_FUNCTION).append(" > 1");
}
dataContainer.setGroupingQuery(sql.toString());
DBDDataFilter dataFilter;
if (presentation.getController().getModel().isMetadataChanged()) {
dataFilter = new DBDDataFilter();
} else {
dataFilter = new DBDDataFilter(groupingViewer.getModel().getDataFilter());
}
String defaultSorting = dataSource.getContainer().getPreferenceStore().getString(ResultSetPreferences.RS_GROUPING_DEFAULT_SORTING);
if (!CommonUtils.isEmpty(defaultSorting) && isDefaultGrouping) {
if (dialect.supportsOrderByIndex()) {
// By default sort by count in desc order
int countPosition = groupAttributes.size() + 1;
StringBuilder orderBy = new StringBuilder();
orderBy.append(countPosition).append(" ").append(defaultSorting);
for (int i = 0; i < groupAttributes.size(); i++) {
orderBy.append(",").append(i + 1);
}
dataFilter.setOrder(orderBy.toString());
} else {
dataFilter.setOrder(groupFunctions.get(groupFunctions.size() - 1) + " " + defaultSorting);
}
}
groupingViewer.setDataFilter(dataFilter, true);
// groupingViewer.refresh();
}
use of org.jkiss.dbeaver.model.sql.SQLDialect in project dbeaver by serge-rider.
the class DBObjectNameCaseTransformer method transformName.
@Nullable
public static String transformName(@NotNull DBPDataSource dataSource, @Nullable String value) {
if (value == null) {
return null;
}
final SQLDialect dialect = dataSource.getSQLDialect();
final boolean isNameCaseSensitive = dataSource.getContainer().getPreferenceStore().getBoolean(ModelPreferences.META_CASE_SENSITIVE) || dialect.storesUnquotedCase() == DBPIdentifierCase.MIXED;
if (isNameCaseSensitive) {
return value;
}
if (DBUtils.isQuotedIdentifier(dataSource, value)) {
if (dialect.supportsQuotedMixedCase() || dialect.supportsUnquotedMixedCase()) {
return value;
}
value = DBUtils.getUnQuotedIdentifier(dataSource, value);
} else {
if (dialect.supportsUnquotedMixedCase() || dialect.storesUnquotedCase() == null) {
return value;
}
}
String xName = dialect.storesUnquotedCase().transform(value);
if (!DBUtils.getQuotedIdentifier(dataSource, xName).equals(xName)) {
// Name contains special characters and has to be quoted - leave it as is
return value;
}
return xName;
}
use of org.jkiss.dbeaver.model.sql.SQLDialect in project dbeaver by serge-rider.
the class SQLGeneratorProcedureCall method generateSQL.
@Override
protected void generateSQL(DBRProgressMonitor monitor, StringBuilder sql, DBSProcedure proc) throws DBException {
Collection<? extends DBSProcedureParameter> parameters = proc.getParameters(monitor);
DBPDataSource dataSource = proc.getDataSource();
{
SQLDialect sqlDialect = dataSource.getSQLDialect();
sqlDialect.generateStoredProcedureCall(sql, proc, CommonUtils.safeCollection(parameters));
}
}
use of org.jkiss.dbeaver.model.sql.SQLDialect in project dbeaver by serge-rider.
the class SQLRuleManager method loadRules.
public void loadRules(@Nullable DBPDataSource dataSource, boolean minimalRules) {
SQLDialect dialect = syntaxManager.getDialect();
TPRuleProvider ruleProvider = GeneralUtils.adapt(dialect, TPRuleProvider.class);
DBPDataSourceContainer dataSourceContainer = dataSource == null ? null : dataSource.getContainer();
final TPToken keywordToken = new TPTokenDefault(SQLTokenType.T_KEYWORD);
final TPToken typeToken = new TPTokenDefault(SQLTokenType.T_TYPE);
final TPToken stringToken = new TPTokenDefault(SQLTokenType.T_STRING);
final TPToken quotedToken = new TPTokenDefault(SQLTokenType.T_QUOTED);
final TPToken numberToken = new TPTokenDefault(SQLTokenType.T_NUMBER);
final TPToken commentToken = new SQLCommentToken();
final SQLDelimiterToken delimiterToken = new SQLDelimiterToken();
final SQLParameterToken parameterToken = new SQLParameterToken();
final SQLVariableToken variableToken = new SQLVariableToken();
final TPToken otherToken = new TPTokenDefault(SQLTokenType.T_OTHER);
final SQLBlockHeaderToken blockHeaderToken = new SQLBlockHeaderToken();
final SQLBlockBeginToken blockBeginToken = new SQLBlockBeginToken();
final SQLBlockEndToken blockEndToken = new SQLBlockEndToken();
List<TPRule> rules = new ArrayList<>();
if (ruleProvider != null) {
ruleProvider.extendRules(dataSourceContainer, rules, TPRuleProvider.RulePosition.INITIAL);
}
// Add rule for single-line comments.
for (String lineComment : dialect.getSingleLineComments()) {
if (lineComment.startsWith("^")) {
rules.add(new LineCommentRule(lineComment, commentToken, (char) 0, false, true));
} else {
rules.add(new EndOfLineRule(lineComment, commentToken, (char) 0, false, true));
}
}
if (ruleProvider != null) {
ruleProvider.extendRules(dataSourceContainer, rules, TPRuleProvider.RulePosition.CONTROL);
}
if (!minimalRules) {
final SQLControlToken controlToken = new SQLControlToken();
String commandPrefix = syntaxManager.getControlCommandPrefix();
// Control rules
for (SQLCommandHandlerDescriptor controlCommand : SQLCommandsRegistry.getInstance().getCommandHandlers()) {
// $NON-NLS-1$
rules.add(new SQLCommandRule(commandPrefix, controlCommand, controlToken));
}
}
{
if (!minimalRules && syntaxManager.isVariablesEnabled()) {
// Variable rule
rules.add(new SQLVariableRule(parameterToken));
}
}
if (!minimalRules) {
// Add rules for delimited identifiers and string literals.
char escapeChar = syntaxManager.getEscapeChar();
String[][] identifierQuoteStrings = syntaxManager.getIdentifierQuoteStrings();
String[][] stringQuoteStrings = syntaxManager.getStringQuoteStrings();
boolean hasDoubleQuoteRule = false;
if (!ArrayUtils.isEmpty(identifierQuoteStrings)) {
for (String[] quotes : identifierQuoteStrings) {
rules.add(new SingleLineRule(quotes[0], quotes[1], quotedToken, escapeChar));
if (quotes[1].equals(SQLConstants.STR_QUOTE_DOUBLE) && quotes[0].equals(quotes[1])) {
hasDoubleQuoteRule = true;
}
}
}
if (!ArrayUtils.isEmpty(stringQuoteStrings)) {
for (String[] quotes : stringQuoteStrings) {
rules.add(new MultiLineRule(quotes[0], quotes[1], stringToken, escapeChar));
}
}
if (!hasDoubleQuoteRule) {
rules.add(new MultiLineRule(SQLConstants.STR_QUOTE_DOUBLE, SQLConstants.STR_QUOTE_DOUBLE, quotedToken, escapeChar));
}
}
if (ruleProvider != null) {
ruleProvider.extendRules(dataSourceContainer, rules, TPRuleProvider.RulePosition.QUOTES);
}
// Add rules for multi-line comments
Pair<String, String> multiLineComments = dialect.getMultiLineComments();
if (multiLineComments != null) {
rules.add(new MultiLineRule(multiLineComments.getFirst(), multiLineComments.getSecond(), commentToken, (char) 0, true));
}
if (!minimalRules) {
// Add generic whitespace rule.
rules.add(new WhitespaceRule(TPTokenAbstract.WHITESPACE));
// Add numeric rule
rules.add(new NumberRule(numberToken));
}
SQLDelimiterRule delimRule = new SQLDelimiterRule(syntaxManager.getStatementDelimiters(), delimiterToken);
rules.add(delimRule);
{
// Delimiter redefine
String delimRedefine = dialect.getScriptDelimiterRedefiner();
if (!CommonUtils.isEmpty(delimRedefine)) {
final SQLSetDelimiterToken setDelimiterToken = new SQLSetDelimiterToken();
rules.add(new SQLDelimiterSetRule(delimRedefine, setDelimiterToken, delimRule));
}
}
if (ruleProvider != null) {
ruleProvider.extendRules(dataSourceContainer, rules, TPRuleProvider.RulePosition.KEYWORDS);
}
if (!minimalRules) {
// Add word rule for keywords, functions, types, and constants.
SQLWordRule wordRule = new SQLWordRule(delimRule, typeToken, otherToken);
for (String reservedWord : dialect.getReservedWords()) {
DBPKeywordType keywordType = dialect.getKeywordType(reservedWord);
// Functions without parentheses has type 'DBPKeywordType.OTHER' (#8710)
if (keywordType == DBPKeywordType.FUNCTION || keywordType == DBPKeywordType.OTHER) {
wordRule.addFunction(reservedWord);
} else {
wordRule.addWord(reservedWord, keywordToken);
}
}
if (dataSource != null) {
for (String type : dialect.getDataTypes(dataSource)) {
wordRule.addWord(type, typeToken);
}
for (String function : dialect.getFunctions(dataSource)) {
wordRule.addFunction(function);
}
}
final String[] blockHeaderStrings = dialect.getBlockHeaderStrings();
if (!ArrayUtils.isEmpty(blockHeaderStrings)) {
for (String bhs : blockHeaderStrings) {
wordRule.addWord(bhs, blockHeaderToken);
}
}
String[][] blockBounds = dialect.getBlockBoundStrings();
if (blockBounds != null) {
for (String[] block : blockBounds) {
if (block.length != 2) {
continue;
}
wordRule.addWord(block[0], blockBeginToken);
wordRule.addWord(block[1], blockEndToken);
}
}
rules.add(wordRule);
// Parameter rule
for (String npPrefix : syntaxManager.getNamedParameterPrefixes()) {
rules.add(new SQLParameterRule(syntaxManager, parameterToken, npPrefix));
}
}
allRules = rules.toArray(new TPRule[0]);
}
use of org.jkiss.dbeaver.model.sql.SQLDialect in project dbeaver by serge-rider.
the class DBUtils method createStatement.
@NotNull
public static DBCStatement createStatement(@NotNull DBCSession session, @NotNull String query, boolean scrollable) throws DBCException {
SQLDialect dialect = SQLUtils.getDialectFromObject(session.getDataSource());
DBCStatementType statementType = DBCStatementType.SCRIPT;
query = SQLUtils.makeUnifiedLineFeeds(session.getDataSource(), query);
if (SQLUtils.isExecQuery(dialect, query)) {
statementType = DBCStatementType.EXEC;
query = dialect.formatStoredProcedureCall(session.getDataSource(), query);
}
return session.prepareStatement(statementType, query, scrollable && session.getDataSource().getInfo().supportsResultSetScroll(), false, false);
}
Aggregations