Skip to content

Commit

Permalink
feat: Multi-Part Names for Variables and Parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
manticore-projects committed Apr 29, 2023
1 parent 4efb99f commit 9da7a06
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 10 deletions.
24 changes: 19 additions & 5 deletions src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
Original file line number Diff line number Diff line change
Expand Up @@ -904,6 +904,7 @@ DeclareStatement Declare(): {


SetStatement Set(): {
String namePart;
Object name;
ArrayList<Expression> expList;
boolean useEqual = false;
Expand All @@ -917,10 +918,19 @@ SetStatement Set(): {
(

[LOOKAHEAD(3) (tk = <K_LOCAL> | tk = <K_SESSION>) {effectParameter = tk.image; } ]
( LOOKAHEAD(2)
<K_DATETIMELITERAL> <K_ZONE> { name = "Time Zone"; useEqual=false; }
| (name = UserVariable() ["=" { useEqual=true; } ])
| (name = RelObjectNameExt() ["=" { useEqual=true; } ])
(
LOOKAHEAD(2)
<K_DATETIMELITERAL> <K_ZONE> { name = "Time Zone"; useEqual=false; }
|
(
name = UserVariable() ["=" { useEqual=true; } ]
)
|
(
name = RelObjectNameExt()
( "." namePart=RelObjectNameExt2() { name+="." + namePart; } )*
["=" { useEqual=true; } ]
)
)
)
exp=Expression()
Expand Down Expand Up @@ -4027,10 +4037,14 @@ NextValExpression NextValExpression() : {
JdbcNamedParameter JdbcNamedParameter() : {
JdbcNamedParameter parameter = new JdbcNamedParameter();
String name;
String namePart;
}
{
":" (name=RelObjectNameExt2() { parameter.setName(name); })
":"
name=RelObjectNameExt2()
( "." namePart=RelObjectNameExt2() { name+="." + namePart; } )*
{
parameter.setName(name);
return parameter;
}
}
Expand Down
18 changes: 13 additions & 5 deletions src/test/java/net/sf/jsqlparser/statement/SetStatementTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,17 @@
*/
package net.sf.jsqlparser.statement;

import java.util.*;

import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.StringValue;
import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;

import java.util.Arrays;
import java.util.Collections;

import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

/**
*
* @author toben
Expand Down Expand Up @@ -93,4 +95,10 @@ public void testSettingUserVariable() throws JSQLParserException {
sqlStr = "SET @@global.time_zone = '01:00'";
assertSqlCanBeParsedAndDeparsed(sqlStr, true);
}

@Test
public void testMultiPartVariables() throws JSQLParserException {
String sqlStr = "set a.b.c=false";
assertSqlCanBeParsedAndDeparsed(sqlStr, true);
}
}
12 changes: 12 additions & 0 deletions src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -5710,4 +5710,16 @@ void testOracleHavingBeforeGroupBy() throws JSQLParserException {
Assertions.assertEquals("count(*) > 1", select.getHaving().toString());
Assertions.assertEquals("GROUP BY id", select.getGroupBy().toString());
}

@Test
void testParameterMultiPartName() throws JSQLParserException {
String sqlStr = "SELECT 1 FROM dual WHERE a = :paramMap.aValue";
PlainSelect select = (PlainSelect) assertSqlCanBeParsedAndDeparsed(sqlStr, true);

assertTrue(select
.getWhere(EqualsTo.class)
.getRightExpression(JdbcNamedParameter.class)
.getName()
.equals("paramMap.aValue"));
}
}

0 comments on commit 9da7a06

Please sign in to comment.