Skip to content

Commit

Permalink
fix IN predicate in SELECT to generate correct column name when eleme…
Browse files Browse the repository at this point in the history
…nt list contains single element
  • Loading branch information
oskar-van-rest committed May 3, 2021
1 parent 0aa5c46 commit 09c218a
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 1 deletion.
12 changes: 12 additions & 0 deletions pgql-lang/src/test/java/oracle/pgql/lang/BugFixTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,13 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import java.util.List;

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;

import oracle.pgql.lang.ir.ExpAsVar;
import oracle.pgql.lang.ir.GraphQuery;
import oracle.pgql.lang.ir.QueryExpression.FunctionCall;
import oracle.pgql.lang.ir.QueryExpression.PropertyAccess;
Expand Down Expand Up @@ -290,4 +293,13 @@ public void testPropertyExpressionWithoutAlias() throws Exception {
String errorMessage = "Alias required (.. AS name)";
assertTrue(pgql.parse(statement).getErrorMessages().contains(errorMessage));
}

@Test
public void testInPredicateColumnName() throws Exception {
String query = "SELECT a.number in (a.number), a.number AS \"a.number\" FROM MATCH (a)";
SelectQuery selectQuery = (SelectQuery) pgql.parse(query).getGraphQuery();
List<ExpAsVar> projectionElements = selectQuery.getProjection().getElements();
assertEquals("a.number in (a.number)", projectionElements.get(0).getName());
assertEquals("a.number", projectionElements.get(1).getName());
}
}
5 changes: 4 additions & 1 deletion pgql-spoofax/trans/normalize.str
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ rules
norm-inPredicate:
t@InPredicate(exp1, notIn, exp2@Array(valueExpressions)) -> result
where <not(is-simple-inPredicate-expression)> exp2
with disjunction := <map(!Eq(exp1, <id>)); to-disjunction> valueExpressions
with disjunction := <map(to-eq-expression(|exp1, t)); to-disjunction> valueExpressions
; disjunction' := <origin-track-forced(!disjunction)> t
; if <?Some(NOT())> notIn
then result := <origin-track-forced(!Not(disjunction'))> t
Expand All @@ -261,6 +261,9 @@ rules
is-simple-inPredicate-expression = ?BindVariable(_)
is-simple-inPredicate-expression = ?Array(<id>); map(is-literal-no-bindVariable) // array with literals only

to-eq-expression(|exp1, origin-term):
exp2 -> <origin-track-forced(!Eq(exp1, exp2))> origin-term

norm-isNull = ?IsNotNull(exp); origin-track-forced(!IsNull(exp)); !Not(<id>)

norm-case:
Expand Down

0 comments on commit 09c218a

Please sign in to comment.