Skip to content

Commit af2837e

Browse files
committed
TEIID-2259 fix for condition nesting
1 parent 98123a6 commit af2837e

File tree

6 files changed

+60
-17
lines changed

6 files changed

+60
-17
lines changed

COPYRIGHT.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Portions Copyright (C) 2008-2011 Red Hat, Inc.
1+
Portions Copyright (C) 2008-2012 Red Hat, Inc.
22
Portions Copyright (C) 2000-2007 MetaMatrix, Inc.
33
Portions Copyright (c) 2000, 2003, 2008 IBM Corporation and others.
44
Portions Copyright (c) 1997-2000 Sun Microsystems, Inc.

api/src/main/java/org/teiid/language/visitor/SQLStringVisitor.java

+18-3
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,7 @@ public void visit(GroupBy obj) {
450450
}
451451

452452
public void visit(In obj) {
453-
append(obj.getLeftExpression());
453+
appendNested(obj.getLeftExpression());
454454
if (obj.isNegated()) {
455455
buffer.append(Tokens.SPACE)
456456
.append(NOT);
@@ -509,7 +509,7 @@ public void visit(Parameter obj) {
509509
}
510510

511511
public void visit(IsNull obj) {
512-
append(obj.getExpression());
512+
appendNested(obj.getExpression());
513513
buffer.append(Tokens.SPACE)
514514
.append(IS)
515515
.append(Tokens.SPACE);
@@ -519,6 +519,21 @@ public void visit(IsNull obj) {
519519
}
520520
buffer.append(NULL);
521521
}
522+
523+
/**
524+
* Condition operators have lower precedence than LIKE/SIMILAR/IS
525+
* @param ex
526+
*/
527+
private void appendNested(Expression ex) {
528+
boolean useParens = ex instanceof Condition;
529+
if (useParens) {
530+
buffer.append(Tokens.LPAREN);
531+
}
532+
append(ex);
533+
if (useParens) {
534+
buffer.append(Tokens.RPAREN);
535+
}
536+
}
522537

523538
public void visit(Join obj) {
524539
TableReference leftItem = obj.getLeftItem();
@@ -578,7 +593,7 @@ public void visit(Join obj) {
578593
}
579594

580595
public void visit(Like obj) {
581-
append(obj.getLeftExpression());
596+
append(obj.getLeftExpression());
582597
if (obj.isNegated()) {
583598
buffer.append(Tokens.SPACE)
584599
.append(NOT);

engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java

+19-4
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ public void visit( Drop obj ) {
354354

355355
public void visit( IsNullCriteria obj ) {
356356
Expression expr = obj.getExpression();
357-
visitNode(expr);
357+
appendNested(expr);
358358
append(SPACE);
359359
append(IS);
360360
append(SPACE);
@@ -483,7 +483,7 @@ public void visit( JoinType obj ) {
483483
}
484484

485485
public void visit( MatchCriteria obj ) {
486-
visitNode(obj.getLeftExpression());
486+
visitNode(obj.getLeftExpression());
487487

488488
append(SPACE);
489489
if (obj.isNegated()) {
@@ -515,7 +515,7 @@ public void visit( MatchCriteria obj ) {
515515
append("'"); //$NON-NLS-1$
516516
}
517517
}
518-
518+
519519
public void visit( NotCriteria obj ) {
520520
append(NOT);
521521
append(" ("); //$NON-NLS-1$
@@ -833,7 +833,7 @@ private void appendSourceHintValue(String sh) {
833833

834834
public void visit( SetCriteria obj ) {
835835
// variable
836-
visitNode(obj.getExpression());
836+
appendNested(obj.getExpression());
837837

838838
// operator and beginning of list
839839
append(SPACE);
@@ -863,6 +863,21 @@ public void visit( SetCriteria obj ) {
863863
}
864864
append(")"); //$NON-NLS-1$
865865
}
866+
867+
/**
868+
* Condition operators have lower precedence than LIKE/SIMILAR/IS
869+
* @param ex
870+
*/
871+
private void appendNested(Expression ex) {
872+
boolean useParens = ex instanceof Criteria;
873+
if (useParens) {
874+
append(Tokens.LPAREN);
875+
}
876+
visitNode(ex);
877+
if (useParens) {
878+
append(Tokens.RPAREN);
879+
}
880+
}
866881

867882
public void visit( SetQuery obj ) {
868883
addCacheHint(obj.getCacheHint());

engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj

+1-1
Original file line numberDiff line numberDiff line change
@@ -3052,7 +3052,7 @@ Token operator() :
30523052
/*
30533053
name=comparison predicate
30543054
description=A value comparison.
3055-
example={code:sql}x = 'a'{code}
3055+
example={code:sql}= 'a'{code}
30563056
*/
30573057
CompareCriteria compareCrit(ParseInfo info, Expression expression) :
30583058
{

engine/src/test/java/org/teiid/query/sql/visitor/TestSQLStringVisitor.java

+13-7
Original file line numberDiff line numberDiff line change
@@ -295,11 +295,11 @@ private void helpTest(LanguageObject obj, String expectedStr) {
295295
Insert insert = new Insert();
296296
insert.setGroup(new GroupSymbol("m.g1")); //$NON-NLS-1$
297297

298-
List vars = new ArrayList();
298+
List<ElementSymbol> vars = new ArrayList<ElementSymbol>();
299299
vars.add(new ElementSymbol("e1")); //$NON-NLS-1$
300300
vars.add(new ElementSymbol("e2")); //$NON-NLS-1$
301301
insert.setVariables(vars);
302-
List values = new ArrayList();
302+
List<Constant> values = new ArrayList<Constant>();
303303
values.add(new Constant(new Integer(5)));
304304
values.add(new Constant("abc")); //$NON-NLS-1$
305305
insert.setValues(values);
@@ -685,15 +685,15 @@ private void helpTest(LanguageObject obj, String expectedStr) {
685685
@Test public void testSetCriteria1() {
686686
SetCriteria sc = new SetCriteria();
687687
sc.setExpression(new ElementSymbol("e1")); //$NON-NLS-1$
688-
sc.setValues(new ArrayList());
688+
sc.setValues(new ArrayList<Expression>());
689689

690690
helpTest(sc, "e1 IN ()"); //$NON-NLS-1$
691691
}
692692

693693
@Test public void testSetCriteria2() {
694694
SetCriteria sc = new SetCriteria();
695695
sc.setExpression(new ElementSymbol("e1")); //$NON-NLS-1$
696-
ArrayList values = new ArrayList();
696+
ArrayList<Expression> values = new ArrayList<Expression>();
697697
values.add(new ElementSymbol("e2")); //$NON-NLS-1$
698698
values.add(new Constant("abc")); //$NON-NLS-1$
699699
sc.setValues(values);
@@ -704,7 +704,7 @@ private void helpTest(LanguageObject obj, String expectedStr) {
704704
@Test public void testSetCriteria3() {
705705
SetCriteria sc = new SetCriteria();
706706
sc.setExpression(new ElementSymbol("e1")); //$NON-NLS-1$
707-
ArrayList values = new ArrayList();
707+
ArrayList<Expression> values = new ArrayList<Expression>();
708708
values.add(null);
709709
values.add(new Constant("b")); //$NON-NLS-1$
710710
sc.setValues(values);
@@ -715,7 +715,7 @@ private void helpTest(LanguageObject obj, String expectedStr) {
715715
@Test public void testSetCriteria4() {
716716
SetCriteria sc = new SetCriteria();
717717
sc.setExpression(new ElementSymbol("e1")); //$NON-NLS-1$
718-
ArrayList values = new ArrayList();
718+
ArrayList<Expression> values = new ArrayList<Expression>();
719719
values.add(new ElementSymbol("e2")); //$NON-NLS-1$
720720
values.add(new Constant("abc")); //$NON-NLS-1$
721721
sc.setValues(values);
@@ -1507,7 +1507,7 @@ private void helpTest(LanguageObject obj, String expectedStr) {
15071507
}
15081508

15091509
@Test public void testDynamicCommand() {
1510-
List symbols = new ArrayList();
1510+
List<ElementSymbol> symbols = new ArrayList<ElementSymbol>();
15111511

15121512
ElementSymbol a1 = new ElementSymbol("a1"); //$NON-NLS-1$
15131513
a1.setType(DataTypeManager.DefaultDataClasses.STRING);
@@ -1720,5 +1720,11 @@ public Expression helpTestExpression(String sql, String expected) throws QueryPa
17201720
@Test public void testReturnStatement() throws QueryParserException {
17211721
helpTest(QueryParser.getQueryParser().parseProcedure("begin if (true) return 1; return; end", false), "CREATE VIRTUAL PROCEDURE\nBEGIN\nIF(TRUE)\nBEGIN\nRETURN 1;\nEND\nRETURN;\nEND");
17221722
}
1723+
1724+
@Test public void testConditionNesting() throws Exception {
1725+
String sql = "select (intkey = intnum) is null, (intkey < intnum) in (true, false) from bqt1.smalla";
1726+
1727+
helpTest(QueryParser.getQueryParser().parseCommand(sql), "SELECT (intkey = intnum) IS NULL, (intkey < intnum) IN (TRUE, FALSE) FROM bqt1.smalla"); //$NON-NLS-1$
1728+
}
17231729

17241730
}

test-integration/common/src/test/java/org/teiid/connector/visitor/util/TestSQLStringVisitor.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ private String getString(LanguageObject obj) {
135135
@Test public void testVisitConvertFunctionOracleStyle() throws Exception {
136136
String expected = "convert(columnA, integer)"; //$NON-NLS-1$
137137

138-
List<? extends Expression> params = Arrays.asList(new ColumnReference(null, "columnA", null, String.class), new Literal("integer", String.class));
138+
List<? extends Expression> params = Arrays.asList((Expression)new ColumnReference(null, "columnA", null, String.class), new Literal("integer", String.class));
139139
Function test = new Function("convert", params, Integer.class); //$NON-NLS-1$
140140

141141
assertEquals(expected, getString(test));
@@ -440,5 +440,12 @@ public void substitute(Argument arg, StringBuilder builder, int index) {
440440
String expected = "select $1 from $*1";
441441
helpTestNativeParsing(sql, expected);
442442
}
443+
444+
@Test public void testConditionNesting() throws Exception {
445+
String sql = "select (intkey = intnum) is null, (intkey < intnum) in (true, false) from bqt1.smalla";
446+
447+
Command command = FakeTranslationFactory.getInstance().getBQTTranslationUtility().parseCommand(sql, true, true);
448+
assertEquals("SELECT (g_0.IntKey = g_0.IntNum) IS NULL, (g_0.IntKey < g_0.IntNum) IN (TRUE, FALSE) FROM SmallA AS g_0", command.toString()); //$NON-NLS-1$
449+
}
443450

444451
}

0 commit comments

Comments
 (0)