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();
+
+ }
+}