From f194d001a79813fd0321191b0c5d781b5acd1d32 Mon Sep 17 00:00:00 2001 From: dev-miro26 Date: Mon, 6 Apr 2026 17:36:56 -0400 Subject: [PATCH 1/4] #40527 Enhance SQL query handling by adding DEFAULT_TERM to STMKnownRuleNames and refining default value expression logic in SQLQueryColumnSpec. --- .../jkiss/dbeaver/model/stm/STMKnownRuleNames.java | 1 + .../sql/semantics/model/ddl/SQLQueryColumnSpec.java | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.model.lsm/src/org/jkiss/dbeaver/model/stm/STMKnownRuleNames.java b/plugins/org.jkiss.dbeaver.model.lsm/src/org/jkiss/dbeaver/model/stm/STMKnownRuleNames.java index 3c23ec951fd7a..187a09fea8327 100644 --- a/plugins/org.jkiss.dbeaver.model.lsm/src/org/jkiss/dbeaver/model/stm/STMKnownRuleNames.java +++ b/plugins/org.jkiss.dbeaver.model.lsm/src/org/jkiss/dbeaver/model/stm/STMKnownRuleNames.java @@ -371,4 +371,5 @@ public class STMKnownRuleNames { public static final String LEFT_PAREN_TERM = SQLStandardParser.VOCABULARY.getSymbolicName(SQLStandardParser.LeftParen); public static final String RIGHT_PAREN_TERM = SQLStandardParser.VOCABULARY.getSymbolicName(SQLStandardParser.RightParen); public static final String LATERAL_TERM = SQLStandardParser.VOCABULARY.getSymbolicName(SQLStandardParser.LATERAL); + public static final String DEFAULT_TERM = SQLStandardLexer.VOCABULARY.getSymbolicName(SQLStandardLexer.DEFAULT); } diff --git a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/semantics/model/ddl/SQLQueryColumnSpec.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/semantics/model/ddl/SQLQueryColumnSpec.java index 0d41b74e2369d..488a400246eb2 100644 --- a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/semantics/model/ddl/SQLQueryColumnSpec.java +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/semantics/model/ddl/SQLQueryColumnSpec.java @@ -123,9 +123,15 @@ public static SQLQueryColumnSpec recognize(SQLQueryModelRecognizer recognizer, S .map(STMTreeNode::getTextContent).orElse(null); STMTreeNode defaultValueNode = node.findFirstChildOfName(STMKnownRuleNames.defaultClause); - SQLQueryValueExpression defaultValueExpr = defaultValueNode == null - ? null - : recognizer.collectValueExpression(defaultValueNode, null); + SQLQueryValueExpression defaultValueExpr = null; + if (defaultValueNode != null) { + STMTreeNode firstChild = defaultValueNode.findFirstNonErrorChild(); + if (firstChild != null && STMKnownRuleNames.DEFAULT_TERM.equals(firstChild.getNodeName())) { + defaultValueExpr = recognizer.collectValueExpression(defaultValueNode, null); + } else if (typeName != null) { + typeName = typeName + " " + defaultValueNode.getTextContent(); + } + } LinkedList constraints = new LinkedList<>(); for (STMTreeNode subnode : node.findChildrenOfName(STMKnownRuleNames.columnConstraintDefinition)) { From f1e1537cc942d821d8b557dd515c14f4d94bc5d7 Mon Sep 17 00:00:00 2001 From: dev-miro26 Date: Tue, 7 Apr 2026 11:30:25 -0400 Subject: [PATCH 2/4] #40527 Enhance SQL query handling by adding DEFAULT_TERM to STMKnownRuleNames and refining default value expression logic in SQLQueryColumnSpec. --- .../grammar/SQLStandardParser.g4 | 4 ++-- .../dbeaver/model/stm/STMKnownRuleNames.java | 1 - .../semantics/model/ddl/SQLQueryColumnSpec.java | 17 ++++++++--------- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.model.lsm/grammar/SQLStandardParser.g4 b/plugins/org.jkiss.dbeaver.model.lsm/grammar/SQLStandardParser.g4 index ab70c126db37f..f475dbf5b0031 100644 --- a/plugins/org.jkiss.dbeaver.model.lsm/grammar/SQLStandardParser.g4 +++ b/plugins/org.jkiss.dbeaver.model.lsm/grammar/SQLStandardParser.g4 @@ -119,11 +119,11 @@ intervalFractionalSecondsPrecision: UnsignedInteger; singleDatetimeField: (nonSecondDatetimeField (LeftParen intervalLeadingFieldPrecision RightParen)?|SECOND (LeftParen intervalLeadingFieldPrecision (Comma intervalFractionalSecondsPrecision)? RightParen)?); // column definition -columnDefinition: columnName dataType defaultClause? columnConstraintDefinition* anyWordWithAnyValue?; // why anyWordWithAnyValue? +columnDefinition: columnName dataType anyWord* defaultClause? columnConstraintDefinition* anyWordWithAnyValue?; columnName: identifier; // default -defaultClause: DEFAULT? valueExpression; +defaultClause: DEFAULT valueExpression; // column constraints columnConstraintDefinition: (constraintNameDefinition)? columnConstraint (constraintAttributes)?; diff --git a/plugins/org.jkiss.dbeaver.model.lsm/src/org/jkiss/dbeaver/model/stm/STMKnownRuleNames.java b/plugins/org.jkiss.dbeaver.model.lsm/src/org/jkiss/dbeaver/model/stm/STMKnownRuleNames.java index 187a09fea8327..3c23ec951fd7a 100644 --- a/plugins/org.jkiss.dbeaver.model.lsm/src/org/jkiss/dbeaver/model/stm/STMKnownRuleNames.java +++ b/plugins/org.jkiss.dbeaver.model.lsm/src/org/jkiss/dbeaver/model/stm/STMKnownRuleNames.java @@ -371,5 +371,4 @@ public class STMKnownRuleNames { public static final String LEFT_PAREN_TERM = SQLStandardParser.VOCABULARY.getSymbolicName(SQLStandardParser.LeftParen); public static final String RIGHT_PAREN_TERM = SQLStandardParser.VOCABULARY.getSymbolicName(SQLStandardParser.RightParen); public static final String LATERAL_TERM = SQLStandardParser.VOCABULARY.getSymbolicName(SQLStandardParser.LATERAL); - public static final String DEFAULT_TERM = SQLStandardLexer.VOCABULARY.getSymbolicName(SQLStandardLexer.DEFAULT); } diff --git a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/semantics/model/ddl/SQLQueryColumnSpec.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/semantics/model/ddl/SQLQueryColumnSpec.java index 488a400246eb2..34e52a9646da9 100644 --- a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/semantics/model/ddl/SQLQueryColumnSpec.java +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/semantics/model/ddl/SQLQueryColumnSpec.java @@ -121,18 +121,17 @@ public static SQLQueryColumnSpec recognize(SQLQueryModelRecognizer recognizer, S .orElse(null); String typeName = Optional.ofNullable(node.findFirstChildOfName(STMKnownRuleNames.dataType)) .map(STMTreeNode::getTextContent).orElse(null); - - STMTreeNode defaultValueNode = node.findFirstChildOfName(STMKnownRuleNames.defaultClause); - SQLQueryValueExpression defaultValueExpr = null; - if (defaultValueNode != null) { - STMTreeNode firstChild = defaultValueNode.findFirstNonErrorChild(); - if (firstChild != null && STMKnownRuleNames.DEFAULT_TERM.equals(firstChild.getNodeName())) { - defaultValueExpr = recognizer.collectValueExpression(defaultValueNode, null); - } else if (typeName != null) { - typeName = typeName + " " + defaultValueNode.getTextContent(); + for (STMTreeNode child : node.findChildrenOfName(STMKnownRuleNames.anyWord)) { + if (typeName != null) { + typeName = typeName + " " + child.getTextContent(); } } + STMTreeNode defaultValueNode = node.findFirstChildOfName(STMKnownRuleNames.defaultClause); + SQLQueryValueExpression defaultValueExpr = defaultValueNode == null + ? null + : recognizer.collectValueExpression(defaultValueNode, null); + LinkedList constraints = new LinkedList<>(); for (STMTreeNode subnode : node.findChildrenOfName(STMKnownRuleNames.columnConstraintDefinition)) { SQLQueryComplexName constraintName = Optional.ofNullable( From 66f1eaea1b1d1cf123fb27da44b95b690fd23ef0 Mon Sep 17 00:00:00 2001 From: dev-miro26 Date: Fri, 10 Apr 2026 00:46:03 -0400 Subject: [PATCH 3/4] #40527 Replace generic anyWord with dedicated typeModifier rule for DDL column type modifiers --- .../org.jkiss.dbeaver.model.lsm/grammar/SQLStandardParser.g4 | 3 ++- .../src/org/jkiss/dbeaver/model/stm/STMKnownRuleNames.java | 1 + .../model/sql/semantics/model/ddl/SQLQueryColumnSpec.java | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.model.lsm/grammar/SQLStandardParser.g4 b/plugins/org.jkiss.dbeaver.model.lsm/grammar/SQLStandardParser.g4 index f475dbf5b0031..de34dc64f37bc 100644 --- a/plugins/org.jkiss.dbeaver.model.lsm/grammar/SQLStandardParser.g4 +++ b/plugins/org.jkiss.dbeaver.model.lsm/grammar/SQLStandardParser.g4 @@ -119,8 +119,9 @@ intervalFractionalSecondsPrecision: UnsignedInteger; singleDatetimeField: (nonSecondDatetimeField (LeftParen intervalLeadingFieldPrecision RightParen)?|SECOND (LeftParen intervalLeadingFieldPrecision (Comma intervalFractionalSecondsPrecision)? RightParen)?); // column definition -columnDefinition: columnName dataType anyWord* defaultClause? columnConstraintDefinition* anyWordWithAnyValue?; +columnDefinition: columnName dataType typeModifier* defaultClause? columnConstraintDefinition* anyWordWithAnyValue?; columnName: identifier; +typeModifier: actualIdentifier; // default defaultClause: DEFAULT valueExpression; diff --git a/plugins/org.jkiss.dbeaver.model.lsm/src/org/jkiss/dbeaver/model/stm/STMKnownRuleNames.java b/plugins/org.jkiss.dbeaver.model.lsm/src/org/jkiss/dbeaver/model/stm/STMKnownRuleNames.java index 3c23ec951fd7a..1cb16fdca084c 100644 --- a/plugins/org.jkiss.dbeaver.model.lsm/src/org/jkiss/dbeaver/model/stm/STMKnownRuleNames.java +++ b/plugins/org.jkiss.dbeaver.model.lsm/src/org/jkiss/dbeaver/model/stm/STMKnownRuleNames.java @@ -63,6 +63,7 @@ public class STMKnownRuleNames { // column definition public static final String columnDefinition = SQLStandardParser.ruleNames[SQLStandardParser.RULE_columnDefinition]; public static final String columnName = SQLStandardParser.ruleNames[SQLStandardParser.RULE_columnName]; + public static final String typeModifier = SQLStandardParser.ruleNames[SQLStandardParser.RULE_typeModifier]; public static final String columnIndex = SQLStandardParser.ruleNames[SQLStandardParser.RULE_columnIndex]; // default diff --git a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/semantics/model/ddl/SQLQueryColumnSpec.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/semantics/model/ddl/SQLQueryColumnSpec.java index 34e52a9646da9..0ec53556dfe13 100644 --- a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/semantics/model/ddl/SQLQueryColumnSpec.java +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/semantics/model/ddl/SQLQueryColumnSpec.java @@ -121,7 +121,7 @@ public static SQLQueryColumnSpec recognize(SQLQueryModelRecognizer recognizer, S .orElse(null); String typeName = Optional.ofNullable(node.findFirstChildOfName(STMKnownRuleNames.dataType)) .map(STMTreeNode::getTextContent).orElse(null); - for (STMTreeNode child : node.findChildrenOfName(STMKnownRuleNames.anyWord)) { + for (STMTreeNode child : node.findChildrenOfName(STMKnownRuleNames.typeModifier)) { if (typeName != null) { typeName = typeName + " " + child.getTextContent(); } From 68b3a11e3bf12907caf8bbd3198c6ead9631825c Mon Sep 17 00:00:00 2001 From: dev-miro26 Date: Fri, 10 Apr 2026 02:52:06 -0400 Subject: [PATCH 4/4] #40527 Replace generic anyWord with dedicated typeModifier rule for DDL column type modifiers --- .../src/org/jkiss/dbeaver/model/stm/LSMInspections.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.model.lsm/src/org/jkiss/dbeaver/model/stm/LSMInspections.java b/plugins/org.jkiss.dbeaver.model.lsm/src/org/jkiss/dbeaver/model/stm/LSMInspections.java index 5508a3d1821f6..cd7d01c3b6e05 100644 --- a/plugins/org.jkiss.dbeaver.model.lsm/src/org/jkiss/dbeaver/model/stm/LSMInspections.java +++ b/plugins/org.jkiss.dbeaver.model.lsm/src/org/jkiss/dbeaver/model/stm/LSMInspections.java @@ -136,7 +136,8 @@ public static Interval matchAnyWordHead(String str) { SQLStandardParser.RULE_aggregateExprParam, SQLStandardParser.RULE_anyWord, SQLStandardParser.RULE_correlationName, - SQLStandardParser.RULE_tableHintKeywords + SQLStandardParser.RULE_tableHintKeywords, + SQLStandardParser.RULE_typeModifier ); @NotNull @@ -270,7 +271,8 @@ public SyntaxInspectionResult prepareAbstractSyntaxInspection(int position) { SQLStandardParser.RULE_anyWordWithAnyValue, SQLStandardParser.RULE_anyProperty, SQLStandardParser.RULE_anyWordsWithProperty, - SQLStandardParser.RULE_anyUnexpected + SQLStandardParser.RULE_anyUnexpected, + SQLStandardParser.RULE_typeModifier ); private static boolean isAnySomething(STMTreeNode node) {