From 15ff84348228278269155348d53dc10fa16d2f98 Mon Sep 17 00:00:00 2001 From: manticore-projects Date: Mon, 17 Oct 2022 03:15:36 +0700 Subject: [PATCH] Assorted fixes (#1646) * fix: add missing public Getter Add public Getter for `updateSets` Fixes #1630 * fix: Assorted Fixes SelectExpressionItem with Function and Complex Parameters Tables with Oracle DB Links Make Table Name Parts accessible Fixes #1644 Fixes #1643 * fix: Revert correct test case --- build.gradle | 3 ++- .../java/net/sf/jsqlparser/schema/Table.java | 24 ++++++++++++++++++- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 3 ++- .../statement/select/SelectTest.java | 22 +++++++++++++++++ 4 files changed, 49 insertions(+), 3 deletions(-) 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()); + } }