Skip to content

Commit 1117acd

Browse files
authored
Minor GPML Match clause clean-up (#663)
* Require parens for implicitly joined graph patterns in MATCH * Cleanup some lints
1 parent bf2696f commit 1117acd

File tree

2 files changed

+21
-28
lines changed

2 files changed

+21
-28
lines changed

lang/src/org/partiql/lang/syntax/SqlParser.kt

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -998,7 +998,7 @@ class SqlParser(
998998
ParseType.MATCH_EXPR_EDGE -> parts.add(child.toGraphMatchEdge())
999999
ParseType.MATCH_EXPR_QUANTIFIER -> quantifier = child.toGraphMatchQuantifier(quantifier)
10001000
ParseType.MATCH_EXPR_RESTRICTOR -> {
1001-
restrictor = when (child.children[0].token!!.sourceText?.toUpperCase()) {
1001+
restrictor = when (child.children[0].token!!.sourceText.toUpperCase()) {
10021002
"TRAIL" -> restrictorTrail()
10031003
"ACYCLIC" -> restrictorAcyclic()
10041004
"SIMPLE" -> restrictorSimple()
@@ -1042,15 +1042,15 @@ class SqlParser(
10421042
if (name != null) error("Invalid parse tree: name encountered more than once in MATCH")
10431043
val token = child.children[0].token!!
10441044
val nameText = when (token.type) {
1045-
TokenType.KEYWORD -> token.sourceText!!
1045+
TokenType.KEYWORD -> token.sourceText
10461046
else -> token.text!!
10471047
}
10481048
name = SymbolPrimitive(nameText, child.getMetas())
10491049
}
10501050
ParseType.MATCH_EXPR_LABEL -> {
10511051
val token = child.children[0].token!!
10521052
val labelText = when (token.type) {
1053-
TokenType.KEYWORD -> token.sourceText!!
1053+
TokenType.KEYWORD -> token.sourceText
10541054
else -> token.text!!
10551055
}
10561056
label.add(SymbolPrimitive(labelText, child.getMetas()))
@@ -1127,15 +1127,15 @@ class SqlParser(
11271127
if (name != null) error("Invalid parse tree: name encountered more than once in MATCH")
11281128
val token = child.children[0].token!!
11291129
val nameText = when (token.type) {
1130-
TokenType.KEYWORD -> token.sourceText!!
1130+
TokenType.KEYWORD -> token.sourceText
11311131
else -> token.text!!
11321132
}
11331133
name = SymbolPrimitive(nameText, child.getMetas())
11341134
}
11351135
ParseType.MATCH_EXPR_LABEL -> {
11361136
val token = child.children[0].token!!
11371137
val labelText = when (token.type) {
1138-
TokenType.KEYWORD -> token.sourceText!!
1138+
TokenType.KEYWORD -> token.sourceText
11391139
else -> token.text!!
11401140
}
11411141
label.add(SymbolPrimitive(labelText, child.getMetas()))
@@ -3502,7 +3502,7 @@ class SqlParser(
35023502
fun consumeKW(keyword: String): Boolean {
35033503
return when (rem.head?.type!!) {
35043504
TokenType.IDENTIFIER, TokenType.QUOTED_IDENTIFIER, TokenType.KEYWORD -> {
3505-
if (rem.head!!.sourceText?.toUpperCase() == keyword) {
3505+
if (rem.head!!.sourceText.toUpperCase() == keyword) {
35063506
rem = rem.tail
35073507
true
35083508
} else {
@@ -3522,7 +3522,7 @@ class SqlParser(
35223522
val startSpan = start.head!!.span
35233523
var last = startSpan
35243524
var len = 0L
3525-
for (next in start!!.tail.subList(0, count - 1)) {
3525+
for (next in start.tail.subList(0, count - 1)) {
35263526
if (next.span.line == last.line) {
35273527
len += (next.span.column - last.column)
35283528
} else {
@@ -3591,21 +3591,10 @@ class SqlParser(
35913591
rem = selector?.remaining ?: rem
35923592

35933593
val matches = ArrayList<ParseNode>()
3594-
var preComma = rem
35953594
do {
3596-
try {
3597-
val pattern = rem.parseMatchPattern()
3598-
matches.add(pattern)
3599-
rem = pattern.remaining
3600-
preComma = rem
3601-
} catch (e: ParserException) {
3602-
if (matches.isEmpty()) {
3603-
throw e
3604-
} else {
3605-
rem = preComma
3606-
break
3607-
}
3608-
}
3595+
val pattern = rem.parseMatchPattern()
3596+
matches.add(pattern)
3597+
rem = pattern.remaining
36093598
} while (consume(TokenType.COMMA))
36103599

36113600
return ParseNode(ParseType.MATCH, this.head, listOfNotNull(expr, selector) + matches, rem)
@@ -3966,7 +3955,7 @@ class SqlParser(
39663955
fun parseRestrictor(): ParseNode? {
39673956
return when (rem.head?.type!!) {
39683957
TokenType.IDENTIFIER -> {
3969-
if (rem.head!!.sourceText?.toUpperCase() in matchRestrictorKWs) {
3958+
if (rem.head!!.sourceText.toUpperCase() in matchRestrictorKWs) {
39703959
val name = rem.atomFromHead()
39713960
rem = name.remaining
39723961
ParseNode(ParseType.MATCH_EXPR_RESTRICTOR, null, listOf(name), name.remaining)
@@ -4006,8 +3995,7 @@ class SqlParser(
40063995
rem = pattern.remaining
40073996

40083997
val predicate = if (rem.head?.keywordText == "where") {
4009-
val rem = rem.tail
4010-
rem.parseExpression()
3998+
rem.tail.parseExpression()
40113999
} else {
40124000
null
40134001
}

lang/test/org/partiql/lang/syntax/SqlParserMatchTest.kt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import org.junit.Ignore
77
import org.junit.Test
88
import org.partiql.lang.domains.PartiqlAst
99
import org.partiql.lang.domains.id
10+
import kotlin.test.assertFailsWith
1011

1112
class SqlParserMatchTest : SqlParserTestBase() {
1213
@Test
@@ -977,10 +978,14 @@ class SqlParserMatchTest : SqlParserTestBase() {
977978
}
978979

979980
@Test
980-
fun matchAndJoinCommas() = assertExpressionNoRoundTrip(
981-
"SELECT a,b,c, t1.x as x, t2.y as y FROM graph MATCH (a) -> (b), (a) -> (c), table1 as t1, table2 as t2",
982-
) {
983-
joinedMatch()
981+
fun matchAndJoinCommas() {
982+
assertFailsWith<ParserException> {
983+
assertExpressionNoRoundTrip(
984+
"SELECT a,b,c, t1.x as x, t2.y as y FROM graph MATCH (a) -> (b), (a) -> (c), table1 as t1, table2 as t2",
985+
) {
986+
joinedMatch()
987+
}
988+
}
984989
}
985990

986991
// TODO label combinators

0 commit comments

Comments
 (0)