alibaba / druid

阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品,为监控而生的数据库连接池
https://github.com/alibaba/druid/wiki
Apache License 2.0
27.95k stars 8.58k forks source link

SQLSelect.toString时出现强制类型转换错误 #3584

Open snoopyhzy opened 4 years ago

snoopyhzy commented 4 years ago

问题语句

select from (select from dual union all select * from dual)

仅在oracle出现

问题分析

应该是在OracleSelectTableReference.java:76,进行了一个强制类型转换到 OracleASTVisitor,而SQLASTOutputVisitor没有实现OracleASTVisitor,SQLASTOutputVisitor感觉是用来做toString输出或者做SQL语句转化的。。。好像没办法了不知道为啥要强制转换成OracleASTVisitor

完整堆栈

/usr/lib/jvm/java-8-openjdk-amd64/bin/java -javaagent:/usr/share/intellij-idea-community/lib/idea_rt.jar=38505:/usr/share/intellij-idea-community/bin -Dfile.encoding=UTF-8 -classpath /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/charsets.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/cldrdata.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/dnsns.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/icedtea-sound.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/jaccess.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/java-atk-wrapper.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/localedata.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/nashorn.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/sunec.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/sunjce_provider.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/sunpkcs11.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext/zipfs.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/jce.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/jsse.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/management-agent.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/resources.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/rt.jar:/home/hzy/IdeaProjects/druidsqlastgui/target/classes:/home/hzy/.m2/repository/com/alibaba/druid/1.1.21/druid-1.1.21.jar cn.snoopyhzy.Window Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: com.alibaba.druid.sql.visitor.SQLASTOutputVisitor cannot be cast to com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor at com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference.accept0(OracleSelectTableReference.java:76) at com.alibaba.druid.sql.ast.SQLObjectImpl.accept(SQLObjectImpl.java:40) at com.alibaba.druid.sql.visitor.SQLASTOutputVisitor.printTableSource(SQLASTOutputVisitor.java:1003) at com.alibaba.druid.sql.visitor.SQLASTOutputVisitor.visit(SQLASTOutputVisitor.java:1973) at com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock.accept0(SQLSelectQueryBlock.java:623) at com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock.accept0(OracleSelectQueryBlock.java:94) at com.alibaba.druid.sql.ast.SQLObjectImpl.accept(SQLObjectImpl.java:40) at com.alibaba.druid.sql.visitor.SQLASTOutputVisitor.visit(SQLASTOutputVisitor.java:3043) at com.alibaba.druid.sql.visitor.SQLASTOutputVisitor.printQuery(SQLASTOutputVisitor.java:1012) at com.alibaba.druid.sql.visitor.SQLASTOutputVisitor.visit(SQLASTOutputVisitor.java:1917) at com.alibaba.druid.sql.ast.statement.SQLSelect.accept0(SQLSelect.java:114) at com.alibaba.druid.sql.ast.SQLObjectImpl.accept(SQLObjectImpl.java:40) at com.alibaba.druid.sql.ast.statement.SQLSelect.output(SQLSelect.java:206) at com.alibaba.druid.sql.ast.SQLObjectImpl.toString(SQLObjectImpl.java:71) at com.alibaba.druid.sql.ast.statement.SQLSelect.toString(SQLSelect.java:231) at cn.snoopyhzy.Window$TreeObject.toString(Window.java:268) at javax.swing.tree.DefaultMutableTreeNode.toString(DefaultMutableTreeNode.java:1244) at javax.swing.JTree.convertValueToText(JTree.java:1603) at javax.swing.tree.DefaultTreeCellRenderer.getTreeCellRendererComponent(DefaultTreeCellRenderer.java:428) at javax.swing.plaf.basic.BasicTreeUI$NodeDimensionsHandler.getNodeDimensions(BasicTreeUI.java:2807) at javax.swing.tree.AbstractLayoutCache.getNodeDimensions(AbstractLayoutCache.java:492) at javax.swing.tree.VariableHeightLayoutCache$TreeStateNode.updatePreferredSize(VariableHeightLayoutCache.java:1360) at javax.swing.tree.VariableHeightLayoutCache$TreeStateNode.expand(VariableHeightLayoutCache.java:1496) at javax.swing.tree.VariableHeightLayoutCache$TreeStateNode.expand(VariableHeightLayoutCache.java:1288) at javax.swing.tree.VariableHeightLayoutCache.ensurePathIsExpanded(VariableHeightLayoutCache.java:984) at javax.swing.tree.VariableHeightLayoutCache.setExpandedState(VariableHeightLayoutCache.java:182) at javax.swing.plaf.basic.BasicTreeUI.updateExpandedDescendants(BasicTreeUI.java:1696) at javax.swing.plaf.basic.BasicTreeUI$Handler.treeExpanded(BasicTreeUI.java:3805) at javax.swing.JTree.fireTreeExpanded(JTree.java:2771) at javax.swing.JTree.setExpandedState(JTree.java:3636) at javax.swing.JTree.expandPath(JTree.java:2219) at javax.swing.plaf.basic.BasicTreeUI.toggleExpandState(BasicTreeUI.java:2286) at javax.swing.plaf.basic.BasicTreeUI.handleExpandControlClick(BasicTreeUI.java:2273) at javax.swing.plaf.basic.BasicTreeUI.checkForClickInExpandControl(BasicTreeUI.java:2231) at javax.swing.plaf.basic.BasicTreeUI$Handler.handleSelection(BasicTreeUI.java:3600) at javax.swing.plaf.basic.BasicTreeUI$Handler.mousePressed(BasicTreeUI.java:3548) at java.awt.Component.processMouseEvent(Component.java:6536) at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) at java.awt.Component.processEvent(Component.java:6304) at java.awt.Container.processEvent(Container.java:2239) at java.awt.Component.dispatchEventImpl(Component.java:4889) at java.awt.Container.dispatchEventImpl(Container.java:2297) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4532) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476) at java.awt.Container.dispatchEventImpl(Container.java:2283) at java.awt.Window.dispatchEventImpl(Window.java:2746) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760) at java.awt.EventQueue.access$500(EventQueue.java:97) at java.awt.EventQueue$3.run(EventQueue.java:709) at java.awt.EventQueue$3.run(EventQueue.java:703) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84) at java.awt.EventQueue$4.run(EventQueue.java:733) at java.awt.EventQueue$4.run(EventQueue.java:731) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) at java.awt.EventQueue.dispatchEvent(EventQueue.java:730) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: com.alibaba.druid.sql.visitor.SQLASTOutputVisitor cannot be cast to com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor at com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference.accept0(OracleSelectTableReference.java:76) at com.alibaba.druid.sql.ast.SQLObjectImpl.accept(SQLObjectImpl.java:40) at com.alibaba.druid.sql.visitor.SQLASTOutputVisitor.printTableSource(SQLASTOutputVisitor.java:1003) at com.alibaba.druid.sql.visitor.SQLASTOutputVisitor.visit(SQLASTOutputVisitor.java:1973) at com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock.accept0(SQLSelectQueryBlock.java:623) at com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock.accept0(OracleSelectQueryBlock.java:94) at com.alibaba.druid.sql.ast.SQLObjectImpl.accept(SQLObjectImpl.java:40) at com.alibaba.druid.sql.visitor.SQLASTOutputVisitor.visit(SQLASTOutputVisitor.java:3043) at com.alibaba.druid.sql.visitor.SQLASTOutputVisitor.printQuery(SQLASTOutputVisitor.java:1012) at com.alibaba.druid.sql.visitor.SQLASTOutputVisitor.visit(SQLASTOutputVisitor.java:1917) at com.alibaba.druid.sql.ast.statement.SQLSelect.accept0(SQLSelect.java:114) at com.alibaba.druid.sql.ast.SQLObjectImpl.accept(SQLObjectImpl.java:40) at com.alibaba.druid.sql.ast.statement.SQLSelect.output(SQLSelect.java:206) at com.alibaba.druid.sql.ast.SQLObjectImpl.toString(SQLObjectImpl.java:71) at com.alibaba.druid.sql.ast.statement.SQLSelect.toString(SQLSelect.java:231) at cn.snoopyhzy.Window$TreeObject.toString(Window.java:268) at javax.swing.tree.DefaultMutableTreeNode.toString(DefaultMutableTreeNode.java:1244) at javax.swing.JTree.convertValueToText(JTree.java:1603) at javax.swing.tree.DefaultTreeCellRenderer.getTreeCellRendererComponent(DefaultTreeCellRenderer.java:428) at javax.swing.plaf.basic.BasicTreeUI$NodeDimensionsHandler.getNodeDimensions(BasicTreeUI.java:2807) at javax.swing.tree.AbstractLayoutCache.getNodeDimensions(AbstractLayoutCache.java:492) at javax.swing.tree.VariableHeightLayoutCache$TreeStateNode.updatePreferredSize(VariableHeightLayoutCache.java:1360) at javax.swing.tree.VariableHeightLayoutCache$TreeStateNode.getPreferredHeight(VariableHeightLayoutCache.java:1168) at javax.swing.tree.VariableHeightLayoutCache$TreeStateNode.collapse(VariableHeightLayoutCache.java:1583) at javax.swing.tree.VariableHeightLayoutCache$TreeStateNode.collapse(VariableHeightLayoutCache.java:1295) at javax.swing.tree.VariableHeightLayoutCache.setExpandedState(VariableHeightLayoutCache.java:188) at javax.swing.plaf.basic.BasicTreeUI$Handler.treeCollapsed(BasicTreeUI.java:3815) at javax.swing.JTree.fireTreeCollapsed(JTree.java:2802) at javax.swing.JTree.setExpandedState(JTree.java:3612) at javax.swing.JTree.collapsePath(JTree.java:2244) at javax.swing.plaf.basic.BasicTreeUI.toggleExpandState(BasicTreeUI.java:2297) at javax.swing.plaf.basic.BasicTreeUI.handleExpandControlClick(BasicTreeUI.java:2273) at javax.swing.plaf.basic.BasicTreeUI.checkForClickInExpandControl(BasicTreeUI.java:2231) at javax.swing.plaf.basic.BasicTreeUI$Handler.handleSelection(BasicTreeUI.java:3600) at javax.swing.plaf.basic.BasicTreeUI$Handler.mousePressed(BasicTreeUI.java:3548) at java.awt.Component.processMouseEvent(Component.java:6536) at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) at java.awt.Component.processEvent(Component.java:6304) at java.awt.Container.processEvent(Container.java:2239) at java.awt.Component.dispatchEventImpl(Component.java:4889) at java.awt.Container.dispatchEventImpl(Container.java:2297) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4532) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476) at java.awt.Container.dispatchEventImpl(Container.java:2283) at java.awt.Window.dispatchEventImpl(Window.java:2746) at java.awt.Component.dispatchEvent(Component.java:4711) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760) at java.awt.EventQueue.access$500(EventQueue.java:97) at java.awt.EventQueue$3.run(EventQueue.java:709) at java.awt.EventQueue$3.run(EventQueue.java:703) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84) at java.awt.EventQueue$4.run(EventQueue.java:733) at java.awt.EventQueue$4.run(EventQueue.java:731) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) at java.awt.EventQueue.dispatchEvent(EventQueue.java:730) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: com.alibaba.druid.sql.visitor.SQLASTOutputVisitor cannot be cast to com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor at com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference.accept0(OracleSelectTableReference.java:76) at com.alibaba.druid.sql.ast.SQLObjectImpl.accept(SQLObjectImpl.java:40) at com.alibaba.druid.sql.visitor.SQLASTOutputVisitor.printTableSource(SQLASTOutputVisitor.java:1003) at com.alibaba.druid.sql.visitor.SQLASTOutputVisitor.visit(SQLASTOutputVisitor.java:1973) at com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock.accept0(SQLSelectQueryBlock.java:623) at com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock.accept0(OracleSelectQueryBlock.java:94) at com.alibaba.druid.sql.ast.SQLObjectImpl.accept(SQLObjectImpl.java:40) at com.alibaba.druid.sql.visitor.SQLASTOutputVisitor.visit(SQLASTOutputVisitor.java:3043) at com.alibaba.druid.sql.visitor.SQLASTOutputVisitor.printQuery(SQLASTOutputVisitor.java:1012) at com.alibaba.druid.sql.visitor.SQLASTOutputVisitor.visit(SQLASTOutputVisitor.java:1917) at com.alibaba.druid.sql.ast.statement.SQLSelect.accept0(SQLSelect.java:114) at com.alibaba.druid.sql.ast.SQLObjectImpl.accept(SQLObjectImpl.java:40) at com.alibaba.druid.sql.ast.statement.SQLSelect.output(SQLSelect.java:206) at com.alibaba.druid.sql.ast.SQLObjectImpl.toString(SQLObjectImpl.java:71) at com.alibaba.druid.sql.ast.statement.SQLSelect.toString(SQLSelect.java:231) at cn.snoopyhzy.Window$TreeObject.toString(Window.java:268) at javax.swing.tree.DefaultMutableTreeNode.toString(DefaultMutableTreeNode.java:1244) at javax.swing.JTree.convertValueToText(JTree.java:1603) at javax.swing.tree.DefaultTreeCellRenderer.getTreeCellRendererComponent(DefaultTreeCellRenderer.java:428) at javax.swing.plaf.basic.BasicTreeUI$NodeDimensionsHandler.getNodeDimensions(BasicTreeUI.java:2807) at javax.swing.tree.AbstractLayoutCache.getNodeDimensions(AbstractLayoutCache.java:492) at javax.swing.tree.VariableHeightLayoutCache$TreeStateNode.updatePreferredSize(VariableHeightLayoutCache.java:1360) at javax.swing.tree.VariableHeightLayoutCache$TreeStateNode.getXOrigin(VariableHeightLayoutCache.java:1143) at javax.swing.tree.VariableHeightLayoutCache$TreeStateNode.getNodeBounds(VariableHeightLayoutCache.java:1130) at javax.swing.tree.VariableHeightLayoutCache.getBounds(VariableHeightLayoutCache.java:220) at javax.swing.plaf.basic.BasicTreeUI.getPathBounds(BasicTreeUI.java:529) at javax.swing.plaf.basic.BasicTreeUI.getPathBounds(BasicTreeUI.java:522) at javax.swing.plaf.basic.BasicTreeUI.paintVerticalPartOfLeg(BasicTreeUI.java:1428) at javax.swing.plaf.metal.MetalTreeUI.paintVerticalPartOfLeg(MetalTreeUI.java:211) at javax.swing.plaf.basic.BasicTreeUI.paint(BasicTreeUI.java:1203) at javax.swing.plaf.metal.MetalTreeUI.paint(MetalTreeUI.java:169) at javax.swing.plaf.ComponentUI.update(ComponentUI.java:161) at javax.swing.JComponent.paintComponent(JComponent.java:780) at javax.swing.JComponent.paint(JComponent.java:1056) at javax.swing.JComponent.paintToOffscreen(JComponent.java:5210) at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:290) at javax.swing.RepaintManager.paint(RepaintManager.java:1272) at javax.swing.JComponent._paintImmediately(JComponent.java:5158) at javax.swing.JComponent.paintImmediately(JComponent.java:4969) at javax.swing.RepaintManager$4.run(RepaintManager.java:831) at javax.swing.RepaintManager$4.run(RepaintManager.java:814) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789) at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738) at javax.swing.RepaintManager.access$1200(RepaintManager.java:64) at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) at java.awt.EventQueue.access$500(EventQueue.java:97) at java.awt.EventQueue$3.run(EventQueue.java:709) at java.awt.EventQueue$3.run(EventQueue.java:703) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

snoopyhzy commented 4 years ago

找到原因了,OracleSelectTableSource没有extends OracleSQLObject