diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java index 3e7cadc704..1165430d5c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java @@ -88,13 +88,21 @@ public class PGExprParser extends SQLExprParser { public SQLExpr primary() { if (lexer.token() == Token.ARRAY) { - SQLArrayExpr array = new SQLArrayExpr(); - array.setExpr(new SQLIdentifierExpr(lexer.stringVal())); + String ident = lexer.stringVal(); lexer.nextToken(); - accept(Token.LBRACKET); - this.exprList(array.getValues(), array); - accept(Token.RBRACKET); - return primaryRest(array); + + if (lexer.token() == Token.LPAREN) { + SQLIdentifierExpr array = new SQLIdentifierExpr(ident); + return this.methodRest(array, true); + } else { + SQLArrayExpr array = new SQLArrayExpr(); + array.setExpr(new SQLIdentifierExpr(ident)); + accept(Token.LBRACKET); + this.exprList(array.getValues(), array); + accept(Token.RBRACKET); + return primaryRest(array); + } + } else if (lexer.token() == Token.POUND) { lexer.nextToken(); if (lexer.token() == Token.LBRACE) { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest62_json.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest62_json.java new file mode 100644 index 0000000000..895cf595d1 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest62_json.java @@ -0,0 +1,55 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.postgresql.select; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +import java.util.List; + +public class PGSelectTest62_json extends TestCase { + private final String dbType = JdbcConstants.POSTGRESQL; + + public void test_0() throws Exception { + String sql = "select array_to_string(array ( select jsonb_array_elements ( '[{\"aa\":\"123\",\"bb\":\"123\"},{\"aa\":\"12356\",\"bb\":\"12356\"}]') ->> 'aa' ) ,',') as aa"; + + List stmtList = SQLUtils.parseStatements(sql, dbType); + SQLStatement stmt = stmtList.get(0); + + assertEquals("SELECT array_to_string(array((\n" + + "\t\tSELECT jsonb_array_elements('[{\"aa\":\"123\",\"bb\":\"123\"},{\"aa\":\"12356\",\"bb\":\"12356\"}]') ->> 'aa'\n" + + "\t)), ',') AS aa", SQLUtils.toPGString(stmt)); + + assertEquals("select array_to_string(array((\n" + + "\t\tselect jsonb_array_elements('[{\"aa\":\"123\",\"bb\":\"123\"},{\"aa\":\"12356\",\"bb\":\"12356\"}]') ->> 'aa'\n" + + "\t)), ',') as aa", SQLUtils.toPGString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); + + assertEquals(1, stmtList.size()); + + SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(dbType); + stmt.accept(visitor); + +// System.out.println("Tables : " + visitor.getTables()); +// System.out.println("fields : " + visitor.getColumns()); +// System.out.println("coditions : " + visitor.getConditions()); + + assertEquals(0, visitor.getColumns().size()); + assertEquals(0, visitor.getTables().size()); + } +}