Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

introduce escape for string literal #1810

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1014,7 +1014,7 @@ private static ConditionExpressionExecutor parseEqualCompare(ExpressionExecutor
rightExpressionExecutor);
default:
throw new OperationNotSupportedException(
"sting cannot be compared with " + rightExpressionExecutor.getReturnType());
"string cannot be compared with " + rightExpressionExecutor.getReturnType());
}
case INT:
switch (rightExpressionExecutor.getReturnType()) {
Expand Down Expand Up @@ -1137,7 +1137,7 @@ private static ConditionExpressionExecutor parseNotEqualCompare(ExpressionExecut
rightExpressionExecutor);
default:
throw new OperationNotSupportedException(
"sting cannot be compared with " + rightExpressionExecutor.getReturnType());
"string cannot be compared with " + rightExpressionExecutor.getReturnType());
}
case INT:
switch (rightExpressionExecutor.getReturnType()) {
Expand Down
4 changes: 4 additions & 0 deletions modules/siddhi-query-compiler/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@
<artifactId>mvel2</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
grammar SiddhiQL;

@header {
//import io.siddhi.query.compiler.exception.SiddhiParserException;
import org.apache.commons.lang3.StringEscapeUtils;
}

parse
Expand Down Expand Up @@ -865,9 +865,8 @@ STRING_LITERAL
'\'' ( ~('\u0000'..'\u001f' | '\''| '"' ) )* '\''
|'"' ( ~('\u0000'..'\u001f' |'"') )* '"'
) {setText(getText().substring(1, getText().length()-1));}
|('"""'(.*?)'"""') {setText(getText().substring(3, getText().length()-3));}
|('"""'(~["\\\r\n] | EscapeSequence)*'"""') {setText(StringEscapeUtils.unescapeJava(getText().substring(3, getText().length()-3)));}
;

//Hidden channels
SINGLE_LINE_COMMENT
: '--' ~[\r\n]* -> channel(HIDDEN)
Expand All @@ -889,6 +888,19 @@ SCRIPT
: '{' SCRIPT_ATOM* '}'
;

fragment EscapeSequence
: '\\' 'u005c'? [btnfr"'\\]
| '\\' 'u005c'? ([0-3]? [0-7])? [0-7]
| '\\' 'u'+ HexDigit HexDigit HexDigit HexDigit
;
fragment HexDigits
: HexDigit ((HexDigit | '_')* HexDigit)?
;

fragment HexDigit
: [0-9a-fA-F]
;

fragment SCRIPT_ATOM
: ~[{}]
| '"' ~["]* '"'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ public void testMultilevelNestedAnnotations3() throws SiddhiParserException {
StreamDefinition streamDefinition = SiddhiCompiler.parseStreamDefinition(
"@sink(url='http://foo.com/test/{{data}}', " +
" @map(type=\"\"\"xml\"\"\", " +
"@payload(\"\"\"{ \"time\":{{time}}}\"\"\") " +
"@payload(\"\"\"{ \\\"time\\\":{{time}}}\"\"\") " +
" )" +
") " +
"define stream fooStream (id int, name string);"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,201 @@
package io.siddhi.query.test;


import io.siddhi.query.api.execution.query.Query;
import io.siddhi.query.api.expression.constant.StringConstant;
import io.siddhi.query.compiler.SiddhiCompiler;
import io.siddhi.query.compiler.exception.SiddhiParserException;
import org.apache.commons.lang3.StringEscapeUtils;
import org.testng.AssertJUnit;
import org.testng.annotations.Test;

public class StringValueTestCase {
@Test
void test1() {
String literal = "abc";
String queryStringFormat = "from a select \"\"\"%s\"\"\" as b insert into c";
Query query = SiddhiCompiler.parseQuery(String.format(queryStringFormat, literal));
AssertJUnit.assertNotNull(query);
AssertJUnit.assertNotNull(query.getSelector());
AssertJUnit.assertNotNull(query.getSelector().getSelectionList());
AssertJUnit.assertNotNull(query.getSelector().getSelectionList().get(0));
AssertJUnit.assertNotNull(query.getSelector().getSelectionList().get(0).getExpression());
AssertJUnit.assertTrue(query.getSelector().getSelectionList().get(0).getExpression() instanceof StringConstant);
AssertJUnit.assertEquals(literal,
((StringConstant) query.getSelector().getSelectionList().get(0).getExpression()).getValue());
}

@Test
void test2() {
String literal = "a'bc";
String queryStringFormat = "from a select \"\"\"%s\"\"\" as b insert into c";
Query query = SiddhiCompiler.parseQuery(String.format(queryStringFormat, literal));
AssertJUnit.assertNotNull(query);
AssertJUnit.assertNotNull(query.getSelector());
AssertJUnit.assertNotNull(query.getSelector().getSelectionList());
AssertJUnit.assertNotNull(query.getSelector().getSelectionList().get(0));
AssertJUnit.assertNotNull(query.getSelector().getSelectionList().get(0).getExpression());
AssertJUnit.assertTrue(query.getSelector().getSelectionList().get(0).getExpression() instanceof StringConstant);
AssertJUnit.assertEquals(literal,
((StringConstant) query.getSelector().getSelectionList().get(0).getExpression()).getValue());
}

@Test(expectedExceptions = SiddhiParserException.class)
void test3() {
String literal = "a\"bc";
String queryStringFormat = "from a select \"\"\"%s\"\"\" as b insert into c";
SiddhiCompiler.parseQuery(String.format(queryStringFormat, literal));
}

@Test
void test4() {
String literal = "a\"bc";
String queryStringFormat = "from a select \"\"\"%s\"\"\" as b insert into c";
Query query = SiddhiCompiler.parseQuery(String.format(queryStringFormat,
StringEscapeUtils.escapeJava(literal)));
AssertJUnit.assertNotNull(query);
AssertJUnit.assertNotNull(query.getSelector());
AssertJUnit.assertNotNull(query.getSelector().getSelectionList());
AssertJUnit.assertNotNull(query.getSelector().getSelectionList().get(0));
AssertJUnit.assertNotNull(query.getSelector().getSelectionList().get(0).getExpression());
AssertJUnit.assertTrue(query.getSelector().getSelectionList().get(0).getExpression() instanceof StringConstant);
AssertJUnit.assertEquals(literal,
((StringConstant) query.getSelector().getSelectionList().get(0).getExpression()).getValue());
}

@Test(expectedExceptions = SiddhiParserException.class)
void test5() {
String literal = "abc\"";
String queryStringFormat = "from a select \"\"\"%s\"\"\" as b insert into c";
SiddhiCompiler.parseQuery(String.format(queryStringFormat, literal));
}

@Test
void test6() {
String literal = "abc\"";
String queryStringFormat = "from a select \"\"\"%s\"\"\" as b insert into c";
Query query = SiddhiCompiler.parseQuery(String.format(queryStringFormat,
StringEscapeUtils.escapeJava(literal)));
AssertJUnit.assertNotNull(query);
AssertJUnit.assertNotNull(query.getSelector());
AssertJUnit.assertNotNull(query.getSelector().getSelectionList());
AssertJUnit.assertNotNull(query.getSelector().getSelectionList().get(0));
AssertJUnit.assertNotNull(query.getSelector().getSelectionList().get(0).getExpression());
AssertJUnit.assertTrue(query.getSelector().getSelectionList().get(0).getExpression() instanceof StringConstant);
AssertJUnit.assertEquals(literal,
((StringConstant) query.getSelector().getSelectionList().get(0).getExpression()).getValue());
}

@Test(expectedExceptions = SiddhiParserException.class)
void test7() {
String literal = "a\"\"\"bc";
String queryStringFormat = "from a select \"\"\"%s\"\"\" as b insert into c";
SiddhiCompiler.parseQuery(String.format(queryStringFormat, literal));
}

@Test
void test8() {
String literal = "a\"\"\"bc";
String queryStringFormat = "from a select \"\"\"%s\"\"\" as b insert into c";
Query query = SiddhiCompiler.parseQuery(String.format(queryStringFormat,
StringEscapeUtils.escapeJava(literal)));
AssertJUnit.assertNotNull(query);
AssertJUnit.assertNotNull(query.getSelector());
AssertJUnit.assertNotNull(query.getSelector().getSelectionList());
AssertJUnit.assertNotNull(query.getSelector().getSelectionList().get(0));
AssertJUnit.assertNotNull(query.getSelector().getSelectionList().get(0).getExpression());
AssertJUnit.assertTrue(query.getSelector().getSelectionList().get(0).getExpression() instanceof StringConstant);
AssertJUnit.assertEquals(literal,
((StringConstant) query.getSelector().getSelectionList().get(0).getExpression()).getValue());
}

@Test
void test9() {
String literal = "a\\u005cbc";
String queryStringFormat = "from a select \"\"\"%s\"\"\" as b insert into c";
Query query = SiddhiCompiler.parseQuery(String.format(queryStringFormat, literal));
AssertJUnit.assertNotNull(query);
AssertJUnit.assertNotNull(query.getSelector());
AssertJUnit.assertNotNull(query.getSelector().getSelectionList());
AssertJUnit.assertNotNull(query.getSelector().getSelectionList().get(0));
AssertJUnit.assertNotNull(query.getSelector().getSelectionList().get(0).getExpression());
AssertJUnit.assertTrue(query.getSelector().getSelectionList().get(0).getExpression() instanceof StringConstant);
AssertJUnit.assertEquals("a\\bc",
((StringConstant) query.getSelector().getSelectionList().get(0).getExpression()).getValue());
}

@Test
void test10() {
String literal = "abc";
String queryStringFormat = "from a select \"%s\" as b insert into c";
Query query = SiddhiCompiler.parseQuery(String.format(queryStringFormat, literal));
AssertJUnit.assertNotNull(query);
AssertJUnit.assertNotNull(query.getSelector());
AssertJUnit.assertNotNull(query.getSelector().getSelectionList());
AssertJUnit.assertNotNull(query.getSelector().getSelectionList().get(0));
AssertJUnit.assertNotNull(query.getSelector().getSelectionList().get(0).getExpression());
AssertJUnit.assertTrue(query.getSelector().getSelectionList().get(0).getExpression() instanceof StringConstant);
AssertJUnit.assertEquals(literal,
((StringConstant) query.getSelector().getSelectionList().get(0).getExpression()).getValue());
}

@Test
void test11() {
String literal = "abc";
String queryStringFormat = "from a select '%s' as b insert into c";
Query query = SiddhiCompiler.parseQuery(String.format(queryStringFormat, literal));
AssertJUnit.assertNotNull(query);
AssertJUnit.assertNotNull(query.getSelector());
AssertJUnit.assertNotNull(query.getSelector().getSelectionList());
AssertJUnit.assertNotNull(query.getSelector().getSelectionList().get(0));
AssertJUnit.assertNotNull(query.getSelector().getSelectionList().get(0).getExpression());
AssertJUnit.assertTrue(query.getSelector().getSelectionList().get(0).getExpression() instanceof StringConstant);
AssertJUnit.assertEquals(literal,
((StringConstant) query.getSelector().getSelectionList().get(0).getExpression()).getValue());
}

@Test
void test12() {
String literal = "a'bc";
String queryStringFormat = "from a select \"%s\" as b insert into c";
Query query = SiddhiCompiler.parseQuery(String.format(queryStringFormat, literal));
AssertJUnit.assertNotNull(query);
AssertJUnit.assertNotNull(query.getSelector());
AssertJUnit.assertNotNull(query.getSelector().getSelectionList());
AssertJUnit.assertNotNull(query.getSelector().getSelectionList().get(0));
AssertJUnit.assertNotNull(query.getSelector().getSelectionList().get(0).getExpression());
AssertJUnit.assertTrue(query.getSelector().getSelectionList().get(0).getExpression() instanceof StringConstant);
AssertJUnit.assertEquals(literal,
((StringConstant) query.getSelector().getSelectionList().get(0).getExpression()).getValue());
}

@Test(expectedExceptions = SiddhiParserException.class)
void test13() {
String literal = "a'bc";
String queryStringFormat = "from a select '%s' as b insert into c";
SiddhiCompiler.parseQuery(String.format(queryStringFormat, literal));
}

@Test(expectedExceptions = SiddhiParserException.class)
void test14() {
String literal = "a'bc";
String queryStringFormat = "from a select '%s' as b insert into c";
SiddhiCompiler.parseQuery(String.format(queryStringFormat, StringEscapeUtils.escapeJava(literal)));
}

@Test(expectedExceptions = SiddhiParserException.class)
void test15() {
String literal = "a\"bc";
String queryStringFormat = "from a select \"%s\" as b insert into c";
SiddhiCompiler.parseQuery(String.format(queryStringFormat, literal));
}

@Test(expectedExceptions = SiddhiParserException.class)
void test16() {
String literal = "a\"bc";
String queryStringFormat = "from a select \"%s\" as b insert into c";
SiddhiCompiler.parseQuery(String.format(queryStringFormat, StringEscapeUtils.escapeJava(literal)));
}


}