diff --git a/pom.xml b/pom.xml index 4e700b8e3e..22012b4a9d 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.alibaba druid - 1.2.7_preview_04 + 1.2.7_preview_05 jar druid A JDBC datasource implementation. diff --git a/src/main/java/com/alibaba/druid/sql/dialect/hive/visitor/HiveOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/hive/visitor/HiveOutputVisitor.java index 9ff41485dd..0933def0ae 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/hive/visitor/HiveOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/hive/visitor/HiveOutputVisitor.java @@ -157,13 +157,6 @@ public class HiveOutputVisitor extends SQLASTOutputVisitor implements HiveASTVis } x.getTableSource().accept(this); - List columns = x.getColumns(); - if (columns.size() > 0) { - print('('); - printAndAccept(columns, ", "); - print(')'); - } - List partitions = x.getPartitions(); int partitionSize = partitions.size(); if (partitionSize > 0) { @@ -183,6 +176,14 @@ public class HiveOutputVisitor extends SQLASTOutputVisitor implements HiveASTVis } print(')'); } + + List columns = x.getColumns(); + if (columns.size() > 0) { + print(" ("); + printAndAccept(columns, ", "); + print(')'); + } + if (x.isIfNotExists()) { print0(ucase ? " IF NOT EXISTS" : " if not exists"); } diff --git a/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitor.java b/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitor.java index 1f8725e916..a373b7da49 100644 --- a/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitor.java @@ -73,6 +73,7 @@ public interface SchemaResolveVisitor extends SQLASTVisitor { static class Context { public final Context parent; public final SQLObject object; + public final int level; private SQLTableSource tableSource; @@ -85,6 +86,9 @@ public interface SchemaResolveVisitor extends SQLASTVisitor { public Context(SQLObject object, Context parent) { this.object = object; this.parent = parent; + this.level = parent == null + ? 0 + : parent.level + 1; } public SQLTableSource getFrom() { diff --git a/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java b/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java index 87bd584131..a4209fa7c4 100644 --- a/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java +++ b/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java @@ -1396,6 +1396,9 @@ class SchemaResolveVisitorFactory { static void resolve(SchemaResolveVisitor visitor, SQLSelectQueryBlock x) { SchemaResolveVisitor.Context ctx = visitor.createContext(x); + if (ctx != null && ctx.level >= 32) { + return; + } SQLTableSource from = x.getFrom(); diff --git a/src/main/java/com/alibaba/druid/support/opds/udf/ExportTables.java b/src/main/java/com/alibaba/druid/support/opds/udf/ExportTables.java index b2570386dd..29f3ded81f 100644 --- a/src/main/java/com/alibaba/druid/support/opds/udf/ExportTables.java +++ b/src/main/java/com/alibaba/druid/support/opds/udf/ExportTables.java @@ -27,13 +27,18 @@ import java.util.Map; public class ExportTables extends UDF { - public String evaluate(String sql) { - return evaluate(sql, null); + public String evaluate(String sql) throws Throwable { + return evaluate(sql, null, false); } - public String evaluate(String sql, String dbTypeName) { + public String evaluate(String sql, String dbTypeName) throws Throwable { + return evaluate(sql, dbTypeName, false); + } + + public String evaluate(String sql, String dbTypeName, boolean throwError) throws Throwable { DbType dbType = dbTypeName == null ? null : DbType.valueOf(dbTypeName); + Throwable error = null; try { List statementList = SQLUtils.parseStatements(sql, dbType); SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(dbType); @@ -54,8 +59,16 @@ public class ExportTables extends UDF { } return buf.toString(); - } catch (Exception ex) { - return null; + } catch (Exception ignored) { + // skip + } catch (StackOverflowError ignored) { + // skip } + + if (throwError && error != null) { + throw error; + } + + return null; } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/hive/HiveSelectTest_48.java b/src/test/java/com/alibaba/druid/bvt/sql/hive/HiveSelectTest_48.java new file mode 100644 index 0000000000..f8f8d52e87 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/hive/HiveSelectTest_48.java @@ -0,0 +1,25 @@ +package com.alibaba.druid.bvt.sql.hive; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLSelectItem; +import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +import java.util.List; + +public class HiveSelectTest_48 extends TestCase { + + + public void test_select() throws Exception { + String sql = "SELECT account_id FROM taobao_office.cloud_yunpan WHERE dt='2021-04-12' AND target='update'"; + List stmtList = SQLUtils.parseStatements(sql, JdbcConstants.HIVE); + SQLStatement sqlStatement = stmtList.get(0); + SQLSelectStatement stmt = (SQLSelectStatement) sqlStatement; + List list = ((SQLSelectQueryBlock) stmt.getSelect().getQuery()).getSelectList(); + + } +}