From c4baecd0f237520fd01f22abda56ba6f5a378b0e Mon Sep 17 00:00:00 2001 From: fanglei <793514387@qq.com> Date: Thu, 5 Nov 2020 17:28:05 +0800 Subject: [PATCH] =?UTF-8?q?bug:=20oracle=E8=A7=A3=E6=9E=90Record=E8=BE=93?= =?UTF-8?q?=E5=87=BA=E4=B8=8D=E6=AD=A3=E7=A1=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dialect/oracle/parser/OracleStatementParser.java | 11 ++++++----- .../druid/sql/visitor/SQLASTOutputVisitor.java | 3 ++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java index 665ce89f4e..b43b3191d8 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java @@ -1907,6 +1907,7 @@ public class OracleStatementParser extends SQLStatementParser { || lexer.token() == Token.TABLE) { break; } else if (lexer.identifierEquals(FnvHash.Constants.TYPE)) { + lexer.nextToken(); name = this.exprParser.name(); accept(Token.IS); @@ -1921,7 +1922,7 @@ public class OracleStatementParser extends SQLStatementParser { lexer.nextToken(); accept(Token.OF); - name = this.exprParser.name(); + SQLName tname = this.exprParser.name(); if (lexer.token() == Token.PERCENT) { lexer.nextToken(); @@ -1929,15 +1930,15 @@ public class OracleStatementParser extends SQLStatementParser { String typeName; if (lexer.identifierEquals(FnvHash.Constants.ROWTYPE)) { lexer.nextToken(); - typeName = "TABLE OF " + name.toString() + "%ROWTYPE"; + typeName = "TABLE OF " + tname.toString() + "%ROWTYPE"; } else if (lexer.token() == Token.LPAREN && lexer.stringVal().equalsIgnoreCase("Varchar2")) { accept(Token.LPAREN); int len = this.exprParser.acceptInteger(); accept(Token.RPAREN); - typeName = "TABLE OF " + name.toString() + "(" + len + ")"; + typeName = "TABLE OF " + tname.toString() + "(" + len + ")"; } else { acceptIdentifier("TYPE"); - typeName = "TABLE OF " + name.toString() + "%TYPE"; + typeName = "TABLE OF " + tname.toString() + "%TYPE"; } dataType = new SQLDataTypeImpl(typeName); @@ -1957,7 +1958,7 @@ public class OracleStatementParser extends SQLStatementParser { ((SQLDataTypeImpl) dataType).setIndexBy(indexBy); } }else if (lexer.token() == Token.SEMI) { - dataType = new SQLDataTypeImpl("TABLE OF " + name.toString()); + dataType = new SQLDataTypeImpl("TABLE OF " + tname.toString()); } dataType.setDbType(dbType); } else if (lexer.identifierEquals("VARRAY")) { diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index fe9ba92938..047e9ed469 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -6827,7 +6827,8 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet String dataTypeName = dataType.getName(); boolean printType = (dataTypeName.startsWith("TABLE OF") && x.getDefaultValue() == null) || dataTypeName.equalsIgnoreCase("REF CURSOR") - || dataTypeName.startsWith("VARRAY("); + || dataTypeName.startsWith("VARRAY(") + || dataTypeName.startsWith("RECORD"); if (printType) { print0(ucase ? "TYPE " : "type "); }