Skip to content

Commit 497fd96

Browse files
committedOct 9, 2024
fix(grammar): Extract the NOT NULL constraint from the DATATYPE node to a new DATATYPE_NULL_CONSTRAINT node
This is necessary because the NOT NULL constraint is not accepted in all declarations and to avoid ambiguity with INLINE_CONSTRAINT
1 parent 6b3f6ff commit 497fd96

File tree

1 file changed

+28
-16
lines changed

1 file changed

+28
-16
lines changed
 

‎zpa-core/src/main/kotlin/org/sonar/plugins/plsqlopen/api/PlSqlGrammar.kt

+28-16
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ enum class PlSqlGrammar : GrammarRuleKey {
5656
CUSTOM_DATATYPE,
5757
REF_DATATYPE,
5858
JSON_DATATYPE,
59+
DATATYPE_NULL_CONSTRAINT,
5960

6061
// Literals
6162
LITERAL,
@@ -453,10 +454,14 @@ enum class PlSqlGrammar : GrammarRuleKey {
453454
ANCHORED_DATATYPE,
454455
REF_DATATYPE,
455456
JSON_DATATYPE,
456-
CUSTOM_DATATYPE),
457-
b.optional(b.firstOf(
458-
b.sequence(NOT, NULL),
459-
NULL)))
457+
CUSTOM_DATATYPE))
458+
459+
b.rule(DATATYPE_NULL_CONSTRAINT).define(
460+
b.firstOf(
461+
b.sequence(NOT, NULL),
462+
NULL
463+
)
464+
)
460465
}
461466

462467
private fun createStatements(b: PlSqlGrammarBuilder) {
@@ -525,7 +530,8 @@ enum class PlSqlGrammar : GrammarRuleKey {
525530
b.rule(ITERAND_DECLARATION).define(
526531
IDENTIFIER_NAME,
527532
b.optional(b.firstOf(MUTABLE, IMMUTABLE)),
528-
b.optional(DATATYPE))
533+
b.optional(DATATYPE),
534+
b.optional(DATATYPE_NULL_CONSTRAINT))
529535

530536
b.rule(ITERATION_CTL_SEQ).define(QUAL_ITERATION_CTL, b.zeroOrMore(COMMA, QUAL_ITERATION_CTL)).skip()
531537

@@ -944,16 +950,19 @@ enum class PlSqlGrammar : GrammarRuleKey {
944950
b.firstOf(
945951
b.sequence(
946952
DATATYPE,
953+
b.optional(DATATYPE_NULL_CONSTRAINT),
947954
b.optional(DEFAULT_VALUE_ASSIGNMENT)),
948955
EXCEPTION),
949956
SEMICOLON)
950957

951958
b.rule(EXCEPTION_DECLARATION).define(IDENTIFIER_NAME, EXCEPTION, SEMICOLON)
952959

953960
b.rule(CUSTOM_SUBTYPE).define(
954-
SUBTYPE, IDENTIFIER_NAME, IS, DATATYPE,
955-
b.optional(RANGE_KEYWORD, NUMERIC_LITERAL, RANGE, NUMERIC_LITERAL),
956-
SEMICOLON)
961+
SUBTYPE, IDENTIFIER_NAME, IS, DATATYPE,
962+
b.optional(DATATYPE_NULL_CONSTRAINT),
963+
b.optional(RANGE_KEYWORD, NUMERIC_LITERAL, RANGE, NUMERIC_LITERAL),
964+
SEMICOLON
965+
)
957966

958967
b.rule(CURSOR_PARAMETER_DECLARATION).define(
959968
IDENTIFIER_NAME,
@@ -970,25 +979,28 @@ enum class PlSqlGrammar : GrammarRuleKey {
970979
b.optional(IS, SELECT_EXPRESSION), SEMICOLON)
971980

972981
b.rule(RECORD_FIELD_DECLARATION).define(
973-
IDENTIFIER_NAME, DATATYPE,
974-
b.optional(DEFAULT_VALUE_ASSIGNMENT))
982+
IDENTIFIER_NAME, DATATYPE,
983+
b.optional(DATATYPE_NULL_CONSTRAINT),
984+
b.optional(DEFAULT_VALUE_ASSIGNMENT)
985+
)
975986

976987
b.rule(RECORD_DECLARATION).define(
977988
TYPE, IDENTIFIER_NAME, IS, RECORD,
978989
LPARENTHESIS, RECORD_FIELD_DECLARATION, b.zeroOrMore(COMMA, RECORD_FIELD_DECLARATION), RPARENTHESIS,
979990
SEMICOLON)
980991

981-
b.rule(NESTED_TABLE_DEFINITION).define(TABLE, OF, DATATYPE)
992+
b.rule(NESTED_TABLE_DEFINITION).define(TABLE, OF, DATATYPE, b.optional(DATATYPE_NULL_CONSTRAINT))
982993

983994
b.rule(TABLE_OF_DECLARATION).define(
984995
TYPE, IDENTIFIER_NAME, IS, NESTED_TABLE_DEFINITION,
985-
b.optional(INDEX, BY, DATATYPE),
996+
b.optional(INDEX, BY, DATATYPE, b.optional(DATATYPE_NULL_CONSTRAINT)),
986997
SEMICOLON)
987998

988999
b.rule(VARRAY_TYPE_DEFINITION).define(
989-
b.firstOf(VARRAY, b.sequence(b.optional(VARYING), ARRAY)),
990-
LPARENTHESIS, INTEGER_LITERAL, RPARENTHESIS,
991-
OF, DATATYPE)
1000+
b.firstOf(VARRAY, b.sequence(b.optional(VARYING), ARRAY)),
1001+
LPARENTHESIS, INTEGER_LITERAL, RPARENTHESIS,
1002+
OF, DATATYPE, b.optional(DATATYPE_NULL_CONSTRAINT)
1003+
)
9921004

9931005
b.rule(VARRAY_DECLARATION).define(
9941006
TYPE, IDENTIFIER_NAME, IS, VARRAY_TYPE_DEFINITION, SEMICOLON)
@@ -1299,7 +1311,7 @@ enum class PlSqlGrammar : GrammarRuleKey {
12991311
b.optional(ORDER_BY_CLAUSE),
13001312
b.optional(SEMICOLON))
13011313

1302-
b.rule(TYPE_ATTRIBUTE).define(IDENTIFIER_NAME, DATATYPE)
1314+
b.rule(TYPE_ATTRIBUTE).define(IDENTIFIER_NAME, DATATYPE, b.optional(DATATYPE_NULL_CONSTRAINT))
13031315

13041316
b.rule(INHERITANCE_CLAUSE).define(b.oneOrMore(b.optional(NOT), b.firstOf(OVERRIDING, FINAL, INSTANTIABLE)))
13051317

0 commit comments

Comments
 (0)
Please sign in to comment.