diff --git a/build.gradle b/build.gradle index e5e7f0282..4781fe9e7 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ plugins { } group = 'com.github.jsqlparser' -version = '4.5-SNAPSHOT' +version = '4.6-SNAPSHOT' description = 'JSQLParser library' java.sourceCompatibility = JavaVersion.VERSION_1_8 @@ -43,6 +43,7 @@ dependencies { // https://mvnrepository.com/artifact/org.mockito/mockito-junit-jupiter testImplementation 'org.mockito:mockito-junit-jupiter:4.+' + testImplementation 'org.junit.jupiter:junit-jupiter-params:+' // enforce latest version of JavaCC javacc 'net.java.dev.javacc:javacc:7.0.12' diff --git a/src/main/java/net/sf/jsqlparser/schema/Table.java b/src/main/java/net/sf/jsqlparser/schema/Table.java index 515cd9f87..0d248910f 100644 --- a/src/main/java/net/sf/jsqlparser/schema/Table.java +++ b/src/main/java/net/sf/jsqlparser/schema/Table.java @@ -103,7 +103,25 @@ public void setSchemaName(String schemaName) { } public String getName() { - return getIndex(NAME_IDX); + String name = getIndex(NAME_IDX); + if (name!=null && name.contains("@")) { + int pos = name.lastIndexOf('@'); + if (pos>0) { + name = name.substring(0, pos ); + } + } + return name; + } + + public String getDBLinkName() { + String name = getIndex(NAME_IDX); + if (name!=null && name.contains("@")) { + int pos = name.lastIndexOf('@'); + if (pos>0 && name.length()>1) { + name = name.substring(pos+1); + } + } + return name; } public Table withName(String name) { @@ -241,4 +259,8 @@ public Table withSqlServerHints(SQLServerHints sqlServerHints) { this.setSqlServerHints(sqlServerHints); return this; } + + public List getNameParts() { + return partItems; + } } diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 080b30aa2..b97073e78 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -3735,7 +3735,8 @@ Expression ComparisonItem() : LOOKAHEAD(3) retval=AnyComparisonExpression() | LOOKAHEAD(ValueListExpression()) retval=ValueListExpression() | LOOKAHEAD(3) retval=SimpleExpression() - | retval=RowConstructor() + | LOOKAHEAD(3) retval=RowConstructor() + | retval=PrimaryExpression() ) { diff --git a/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java b/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java index 8b6ea957b..8d890b265 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java @@ -46,6 +46,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -5243,4 +5244,25 @@ public void testNamedWindowDefinitionIssue1581_2() throws JSQLParserException { public void testTimestamptzDateTimeLiteral() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("SELECT * FROM table WHERE x >= TIMESTAMPTZ '2021-07-05 00:00:00+00'"); } + + + @Test + public void testFunctionComplexExpressionParametersIssue1644() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("SELECT test(1=1, 'a', 'b')", true); + assertSqlCanBeParsedAndDeparsed("SELECT if(instr('avc','a')=0, 'avc', 'aaa')", true); + } + + @Test + public void testOracleDBLink() throws JSQLParserException { + String sqlStr = "SELECT * from tablename@dblink"; + assertSqlCanBeParsedAndDeparsed(sqlStr, true); + + Select select = (Select) CCJSqlParserUtil.parse(sqlStr); + PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + Table table = (Table) plainSelect.getFromItem(); + + assertNotEquals("tablename@dblink", table.getName()); + assertEquals("tablename", table.getName()); + assertEquals("dblink", table.getDBLinkName()); + } }