Search in sources :

Example 21 with SQLDialect

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();
}
Also used : DBException(org.jkiss.dbeaver.DBException) DBDDataFilter(org.jkiss.dbeaver.model.data.DBDDataFilter) SQLDialect(org.jkiss.dbeaver.model.sql.SQLDialect) SQLSyntaxManager(org.jkiss.dbeaver.model.sql.SQLSyntaxManager) DBCStatistics(org.jkiss.dbeaver.model.exec.DBCStatistics) DBPDataSource(org.jkiss.dbeaver.model.DBPDataSource) DBSDataContainer(org.jkiss.dbeaver.model.struct.DBSDataContainer)

Example 22 with SQLDialect

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;
}
Also used : SQLDialect(org.jkiss.dbeaver.model.sql.SQLDialect) Nullable(org.jkiss.code.Nullable)

Example 23 with SQLDialect

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));
    }
}
Also used : SQLDialect(org.jkiss.dbeaver.model.sql.SQLDialect) DBPDataSource(org.jkiss.dbeaver.model.DBPDataSource)

Example 24 with SQLDialect

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]);
}
Also used : ArrayList(java.util.ArrayList) DBPDataSourceContainer(org.jkiss.dbeaver.model.DBPDataSourceContainer) SQLCommandHandlerDescriptor(org.jkiss.dbeaver.model.sql.registry.SQLCommandHandlerDescriptor) DBPKeywordType(org.jkiss.dbeaver.model.DBPKeywordType) SQLDialect(org.jkiss.dbeaver.model.sql.SQLDialect)

Example 25 with SQLDialect

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);
}
Also used : BasicSQLDialect(org.jkiss.dbeaver.model.impl.sql.BasicSQLDialect) SQLDialect(org.jkiss.dbeaver.model.sql.SQLDialect) NotNull(org.jkiss.code.NotNull)

Aggregations

SQLDialect (org.jkiss.dbeaver.model.sql.SQLDialect)27 NotNull (org.jkiss.code.NotNull)12 BasicSQLDialect (org.jkiss.dbeaver.model.impl.sql.BasicSQLDialect)6 DBCExecutionContext (org.jkiss.dbeaver.model.exec.DBCExecutionContext)5 JDBCStatement (org.jkiss.dbeaver.model.exec.jdbc.JDBCStatement)4 ExecuteBatchImpl (org.jkiss.dbeaver.model.impl.data.ExecuteBatchImpl)4 JDBCSQLDialect (org.jkiss.dbeaver.model.impl.jdbc.JDBCSQLDialect)4 SQLDataSource (org.jkiss.dbeaver.model.sql.SQLDataSource)4 BadLocationException (org.eclipse.jface.text.BadLocationException)3 IDocument (org.eclipse.jface.text.IDocument)3 StyledText (org.eclipse.swt.custom.StyledText)3 FillLayout (org.eclipse.swt.layout.FillLayout)3 GridData (org.eclipse.swt.layout.GridData)3 Composite (org.eclipse.swt.widgets.Composite)3 DBPDataSource (org.jkiss.dbeaver.model.DBPDataSource)3 SQLEditorBase (org.jkiss.dbeaver.ui.editors.sql.SQLEditorBase)3 File (java.io.File)2 Map (java.util.Map)2 ITextViewer (org.eclipse.jface.text.ITextViewer)2 TextAttribute (org.eclipse.jface.text.TextAttribute)2