diff --git a/pom.xml b/pom.xml
index ca33a00303..41766f7da4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
-->
com.alibaba
druid
- 1.0.28-SNAPSHOT
+ 1.0.28
jar
druid
diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java
index 8519865ad7..41d802353b 100644
--- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java
+++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java
@@ -1114,6 +1114,10 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements
}
public void setDriverClassName(String driverClass) {
+ if (driverClass != null && driverClass.length() > 256) {
+ throw new IllegalArgumentException("driverClassName length > 256.");
+ }
+
if (inited) {
if (StringUtils.equals(this.driverClass, driverClass)) {
return;
diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java
index 81ad6dc17a..f83d895a28 100644
--- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java
+++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java
@@ -1031,7 +1031,8 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
if (realDriverClassName.equals(JdbcConstants.MYSQL_DRIVER) //
|| realDriverClassName.equals(JdbcConstants.MYSQL_DRIVER_6)) {
this.exceptionSorter = new MySqlExceptionSorter();
- } else if (realDriverClassName.equals(JdbcConstants.ORACLE_DRIVER)) {
+ } else if (realDriverClassName.equals(JdbcConstants.ORACLE_DRIVER)
+ || realDriverClassName.equals(JdbcConstants.ORACLE_DRIVER2)) {
this.exceptionSorter = new OracleExceptionSorter();
} else if (realDriverClassName.equals("com.informix.jdbc.IfxDriver")) {
this.exceptionSorter = new InformixExceptionSorter();
diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLInSubQueryExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLInSubQueryExpr.java
index 18e5a82c4b..cdce963f35 100644
--- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLInSubQueryExpr.java
+++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLInSubQueryExpr.java
@@ -47,6 +47,9 @@ public class SQLInSubQueryExpr extends SQLExprImpl implements Serializable {
}
public void setExpr(SQLExpr expr) {
+ if (expr != null) {
+ expr.setParent(this);
+ }
this.expr = expr;
}
diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateViewStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateViewStatement.java
index 8baa8d8830..a4e081bc89 100644
--- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateViewStatement.java
+++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateViewStatement.java
@@ -33,6 +33,10 @@ public class SQLCreateViewStatement extends SQLStatementImpl implements SQLDDLSt
protected SQLSelect subQuery;
protected boolean ifNotExists = false;
+ protected String algorithm;
+ protected SQLName definer;
+ protected String sqlSecurity;
+
protected final List columns = new ArrayList();
private Level with;
@@ -109,6 +113,33 @@ public class SQLCreateViewStatement extends SQLStatementImpl implements SQLDDLSt
this.comment = comment;
}
+ public String getAlgorithm() {
+ return algorithm;
+ }
+
+ public void setAlgorithm(String algorithm) {
+ this.algorithm = algorithm;
+ }
+
+ public SQLName getDefiner() {
+ return definer;
+ }
+
+ public void setDefiner(SQLName definer) {
+ if (definer != null) {
+ definer.setParent(this);
+ }
+ this.definer = definer;
+ }
+
+ public String getSqlSecurity() {
+ return sqlSecurity;
+ }
+
+ public void setSqlSecurity(String sqlSecurity) {
+ this.sqlSecurity = sqlSecurity;
+ }
+
public void output(StringBuffer buf) {
buf.append("CREATE VIEW ");
this.name.output(buf);
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java
index 353945fcde..00b24a26c7 100644
--- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java
+++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java
@@ -37,55 +37,8 @@ import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr;
import com.alibaba.druid.sql.ast.expr.SQLNCharExpr;
import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
-import com.alibaba.druid.sql.ast.statement.SQLAlterDatabaseStatement;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddConstraint;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddPartition;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableAnalyzePartition;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableCheckPartition;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableCoalescePartition;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableConvertCharSet;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableKeys;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableDiscardPartition;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropColumnItem;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropConstraint;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropForeignKey;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropIndex;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropKey;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropPartition;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropPrimaryKey;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableConstraint;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableKeys;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableImportPartition;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableOptimizePartition;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableReOrganizePartition;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableRebuildPartition;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableRepairPartition;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement;
-import com.alibaba.druid.sql.ast.statement.SQLAlterTableTruncatePartition;
-import com.alibaba.druid.sql.ast.statement.SQLBlockStatement;
-import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
-import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement;
-import com.alibaba.druid.sql.ast.statement.SQLCreateIndexStatement;
-import com.alibaba.druid.sql.ast.statement.SQLCreateProcedureStatement;
-import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
-import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
-import com.alibaba.druid.sql.ast.statement.SQLIfStatement;
-import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
+import com.alibaba.druid.sql.ast.statement.*;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause;
-import com.alibaba.druid.sql.ast.statement.SQLLoopStatement;
-import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey;
-import com.alibaba.druid.sql.ast.statement.SQLSelect;
-import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem;
-import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
-import com.alibaba.druid.sql.ast.statement.SQLSetStatement;
-import com.alibaba.druid.sql.ast.statement.SQLShowTablesStatement;
-import com.alibaba.druid.sql.ast.statement.SQLTableSource;
-import com.alibaba.druid.sql.ast.statement.SQLUnique;
-import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem;
-import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.ConditionValue;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.ConditionValue.ConditionType;
@@ -179,7 +132,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTableStatusSta
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTriggersStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowVariantsStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowWarningsStatement;
-import com.alibaba.druid.sql.ast.statement.SQLStartTransactionStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUnlockTablesStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MysqlDeallocatePrepareStatement;
@@ -376,7 +328,8 @@ public class MySqlStatementParser extends SQLStatementParser {
return parseCreateUser();
}
- if (lexer.token() == Token.VIEW) {
+ if (lexer.token() == Token.VIEW
+ || identifierEquals("ALGORITHM")) {
if (replace) {
lexer.reset(markBp, markChar, Token.CREATE);
}
@@ -398,7 +351,7 @@ public class MySqlStatementParser extends SQLStatementParser {
return parseCreateProcedure();
}
- throw new ParserException("TODO " + lexer.token());
+ throw new ParserException("TODO " + lexer.info());
}
public SQLStatement parseCreateIndex(boolean acceptCreate) {
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java
index 80a6afd6d1..5c46267177 100644
--- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java
+++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java
@@ -681,20 +681,8 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
int index = x.getIndex();
if (index >= 0 && index < parametersSize) {
- Object param = this.getParameters().get(index);
- if (param instanceof Collection && x.getParent() instanceof SQLInListExpr) {
- boolean first = true;
- for (Object item : (Collection) param) {
- if (!first) {
- print0(", ");
- }
- printParameter(item);
- first = false;
- }
- } else {
- printParameter(param);
- }
- return false;
+
+ return super.visit(x);
}
}
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsInsertStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsInsertStatement.java
index 5e20446289..bca8af50ff 100644
--- a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsInsertStatement.java
+++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsInsertStatement.java
@@ -21,13 +21,14 @@ import java.util.List;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.SQLStatementImpl;
import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource;
+import com.alibaba.druid.sql.ast.statement.SQLTableSource;
import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
public class OdpsInsertStatement extends SQLStatementImpl implements SQLStatement {
- private SQLSubqueryTableSource from;
+ private SQLTableSource from;
private List items = new ArrayList();
@@ -35,11 +36,11 @@ public class OdpsInsertStatement extends SQLStatementImpl implements SQLStatemen
super (JdbcConstants.ODPS);
}
- public void setFrom(SQLSubqueryTableSource from) {
+ public void setFrom(SQLTableSource from) {
this.from = from;
}
- public SQLSubqueryTableSource getFrom() {
+ public SQLTableSource getFrom() {
return from;
}
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsValuesTableSource.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsValuesTableSource.java
new file mode 100644
index 0000000000..86311cbc06
--- /dev/null
+++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsValuesTableSource.java
@@ -0,0 +1,42 @@
+package com.alibaba.druid.sql.dialect.odps.ast;
+
+import com.alibaba.druid.sql.ast.SQLName;
+import com.alibaba.druid.sql.ast.expr.SQLListExpr;
+import com.alibaba.druid.sql.ast.statement.SQLTableSource;
+import com.alibaba.druid.sql.ast.statement.SQLTableSourceImpl;
+import com.alibaba.druid.sql.dialect.odps.ast.OdpsObject;
+import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor;
+import com.alibaba.druid.sql.visitor.SQLASTVisitor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by wenshao on 23/02/2017.
+ */
+public class OdpsValuesTableSource extends SQLTableSourceImpl implements OdpsObject {
+ private List values = new ArrayList();
+ private List columns = new ArrayList();
+
+ @Override
+ protected void accept0(SQLASTVisitor visitor) {
+ accept0((OdpsASTVisitor) visitor);
+ }
+
+ public List getValues() {
+ return values;
+ }
+
+ public List getColumns() {
+ return columns;
+ }
+
+ @Override
+ public void accept0(OdpsASTVisitor visitor) {
+ if (visitor.visit(this)) {
+ acceptChild(visitor, values);
+ acceptChild(visitor, columns);
+ }
+ visitor.endVisit(this);
+ }
+}
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsSelectParser.java
index 2c74cd3578..88a596e0b1 100644
--- a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsSelectParser.java
+++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsSelectParser.java
@@ -19,12 +19,14 @@ import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLLimit;
import com.alibaba.druid.sql.ast.SQLOrderingSpecification;
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
+import com.alibaba.druid.sql.ast.expr.SQLListExpr;
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem;
import com.alibaba.druid.sql.ast.statement.SQLSelectQuery;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
import com.alibaba.druid.sql.dialect.odps.ast.OdpsLateralViewTableSource;
import com.alibaba.druid.sql.dialect.odps.ast.OdpsSelectQueryBlock;
+import com.alibaba.druid.sql.dialect.odps.ast.OdpsValuesTableSource;
import com.alibaba.druid.sql.parser.SQLExprParser;
import com.alibaba.druid.sql.parser.SQLSelectParser;
import com.alibaba.druid.sql.parser.Token;
@@ -123,6 +125,41 @@ public class OdpsSelectParser extends SQLSelectParser {
return queryRest(queryBlock);
}
+
+ public SQLTableSource parseTableSource() {
+ if (lexer.token() == Token.VALUES) {
+ lexer.nextToken();
+ OdpsValuesTableSource tableSource = new OdpsValuesTableSource();
+
+ for (;;) {
+ accept(Token.LPAREN);
+ SQLListExpr listExpr = new SQLListExpr();
+ this.exprParser.exprList(listExpr.getItems(), listExpr);
+ accept(Token.RPAREN);
+
+ listExpr.setParent(tableSource);
+
+ tableSource.getValues().add(listExpr);
+
+ if (lexer.token() == Token.COMMA) {
+ lexer.nextToken();
+ continue;
+ }
+ break;
+ }
+
+ String alias = this.as();
+ tableSource.setAlias(alias);
+
+ accept(Token.LPAREN);
+ this.exprParser.names(tableSource.getColumns(), tableSource);
+ accept(Token.RPAREN);
+
+ return tableSource;
+ }
+
+ return super.parseTableSource();
+ }
protected SQLTableSource parseTableSourceRest(SQLTableSource tableSource) {
tableSource = super.parseTableSourceRest(tableSource);
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java
index d7b1e29570..dedca4506d 100644
--- a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java
+++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java
@@ -226,19 +226,26 @@ public class OdpsStatementParser extends SQLStatementParser {
if (lexer.token() == Token.FROM) {
lexer.nextToken();
- accept(Token.LPAREN);
- SQLSelectParser selectParser = createSQLSelectParser();
- SQLSelect select = selectParser.select();
+ if (lexer.token() == Token.IDENTIFIER) {
+ SQLName tableName = this.exprParser.name();
+ SQLExprTableSource from = new SQLExprTableSource(tableName);
+ stmt.setFrom(from);
+ } else {
+ accept(Token.LPAREN);
- accept(Token.RPAREN);
+ SQLSelectParser selectParser = createSQLSelectParser();
+ SQLSelect select = selectParser.select();
- String alias = lexer.stringVal();
- accept(Token.IDENTIFIER);
+ accept(Token.RPAREN);
- SQLSubqueryTableSource from = new SQLSubqueryTableSource(select, alias);
+ String alias = lexer.stringVal();
+ accept(Token.IDENTIFIER);
- stmt.setFrom(from);
+ SQLSubqueryTableSource from = new SQLSubqueryTableSource(select, alias);
+
+ stmt.setFrom(from);
+ }
}
for (;;) {
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitor.java
index e054fdbefb..8301f1e0ef 100644
--- a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitor.java
+++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitor.java
@@ -15,24 +15,7 @@
*/
package com.alibaba.druid.sql.dialect.odps.visitor;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsAddStatisticStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsAnalyzeTableStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsCreateTableStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsDescStmt;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsGrantStmt;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsInsert;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsInsertStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsLateralViewTableSource;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsListStmt;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsReadStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsRemoveStatisticStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsSelectQueryBlock;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsSetLabelStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowGrantsStmt;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowPartitionsStmt;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowStatisticStmt;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsStatisticClause;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsUDTFSQLSelectItem;
+import com.alibaba.druid.sql.dialect.odps.ast.*;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public interface OdpsASTVisitor extends SQLASTVisitor {
@@ -128,4 +111,8 @@ public interface OdpsASTVisitor extends SQLASTVisitor {
void endVisit(OdpsLateralViewTableSource x);
boolean visit(OdpsLateralViewTableSource x);
+
+ void endVisit(OdpsValuesTableSource x);
+
+ boolean visit(OdpsValuesTableSource x);
}
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitorAdapter.java
index 01301b60d6..0a859c84ed 100644
--- a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitorAdapter.java
+++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitorAdapter.java
@@ -15,24 +15,7 @@
*/
package com.alibaba.druid.sql.dialect.odps.visitor;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsAddStatisticStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsAnalyzeTableStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsCreateTableStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsDescStmt;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsGrantStmt;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsInsert;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsInsertStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsLateralViewTableSource;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsListStmt;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsReadStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsRemoveStatisticStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsSelectQueryBlock;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsSetLabelStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowGrantsStmt;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowPartitionsStmt;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowStatisticStmt;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsStatisticClause;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsUDTFSQLSelectItem;
+import com.alibaba.druid.sql.dialect.odps.ast.*;
import com.alibaba.druid.sql.visitor.SQLASTVisitorAdapter;
@@ -268,4 +251,13 @@ public class OdpsASTVisitorAdapter extends SQLASTVisitorAdapter implements OdpsA
return true;
}
+ @Override
+ public void endVisit(OdpsValuesTableSource x) {
+
+ }
+
+ @Override
+ public boolean visit(OdpsValuesTableSource x) {
+ return true;
+ }
}
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java
index e96efc145b..ac355472d8 100644
--- a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java
+++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java
@@ -27,32 +27,9 @@ import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.expr.SQLCaseExpr;
import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
-import com.alibaba.druid.sql.ast.statement.SQLAssignItem;
-import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
-import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
-import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource;
+import com.alibaba.druid.sql.ast.statement.*;
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType;
-import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
-import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource;
-import com.alibaba.druid.sql.ast.statement.SQLTableElement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsAddStatisticStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsAnalyzeTableStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsCreateTableStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsDescStmt;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsGrantStmt;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsInsert;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsInsertStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsLateralViewTableSource;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsListStmt;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsReadStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsRemoveStatisticStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsSelectQueryBlock;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsSetLabelStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowGrantsStmt;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowPartitionsStmt;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowStatisticStmt;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsStatisticClause;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsUDTFSQLSelectItem;
+import com.alibaba.druid.sql.dialect.odps.ast.*;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
import com.alibaba.druid.util.JdbcConstants;
@@ -194,15 +171,22 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis
@Override
public boolean visit(OdpsInsertStatement x) {
+ SQLTableSource from = x.getFrom();
if (x.getFrom() != null) {
- print0(ucase ? "FROM (" : "from (");
- incrementIndent();
- println();
- x.getFrom().getSelect().accept(this);
- decrementIndent();
- println();
- print0(") ");
- print0(x.getFrom().getAlias());
+ if (from instanceof SQLSubqueryTableSource) {
+ SQLSelect select = ((SQLSubqueryTableSource) from).getSelect();
+ print0(ucase ? "FROM (" : "from (");
+ incrementIndent();
+ println();
+ select.accept(this);
+ decrementIndent();
+ println();
+ print0(") ");
+ print0(x.getFrom().getAlias());
+ } else {
+ print0(ucase ? "FROM " : "from ");
+ from.accept(this);
+ }
println();
}
@@ -910,4 +894,23 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis
return false;
}
+
+ @Override
+ public void endVisit(OdpsValuesTableSource x) {
+
+ }
+
+ @Override
+ public boolean visit(OdpsValuesTableSource x) {
+ print0(ucase ? "VALUES " : "values ");
+ printAndAccept(x.getValues(), ", ");
+
+ print(' ');
+ print0(x.getAlias());
+ print0(" (");
+ printAndAccept(x.getColumns(), ", ");
+ print(')');
+
+ return false;
+ }
}
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsSchemaStatVisitor.java
index 96fc53f955..6f188159ca 100644
--- a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsSchemaStatVisitor.java
+++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsSchemaStatVisitor.java
@@ -15,28 +15,14 @@
*/
package com.alibaba.druid.sql.dialect.odps.visitor;
-import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
-import com.alibaba.druid.sql.ast.statement.SQLGrantStatement;
-import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsAddStatisticStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsAnalyzeTableStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsCreateTableStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsDescStmt;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsGrantStmt;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsInsert;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsInsertStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsLateralViewTableSource;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsListStmt;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsReadStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsRemoveStatisticStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsSelectQueryBlock;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsSetLabelStatement;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowGrantsStmt;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowPartitionsStmt;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsShowStatisticStmt;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsStatisticClause;
-import com.alibaba.druid.sql.dialect.odps.ast.OdpsUDTFSQLSelectItem;
+import com.alibaba.druid.sql.ast.SQLExpr;
+import com.alibaba.druid.sql.ast.SQLName;
+import com.alibaba.druid.sql.ast.statement.*;
+import com.alibaba.druid.sql.dialect.odps.ast.*;
import com.alibaba.druid.sql.visitor.SchemaStatVisitor;
+import com.alibaba.druid.stat.TableStat;
+
+import java.util.Map;
public class OdpsSchemaStatVisitor extends SchemaStatVisitor implements OdpsASTVisitor {
@@ -57,7 +43,7 @@ public class OdpsSchemaStatVisitor extends SchemaStatVisitor implements OdpsASTV
@Override
public boolean visit(OdpsInsertStatement x) {
- return false;
+ return true;
}
@Override
@@ -67,6 +53,31 @@ public class OdpsSchemaStatVisitor extends SchemaStatVisitor implements OdpsASTV
@Override
public boolean visit(OdpsInsert x) {
+ setMode(x, TableStat.Mode.Insert);
+
+ setAliasMap();
+
+ SQLExprTableSource tableSource = x.getTableSource();
+ SQLExpr tableName = tableSource.getExpr();
+
+ if (tableName instanceof SQLName) {
+ String ident = ((SQLName) tableName).toString();
+ setCurrentTable(ident);
+
+ TableStat stat = getTableStat(ident);
+ stat.incrementInsertCount();
+
+ Map aliasMap = getAliasMap();
+ putAliasMap(aliasMap, tableSource.getAlias(), ident);
+ putAliasMap(aliasMap, ident, ident);
+ }
+
+ for (SQLAssignItem partition : x.getPartitions()) {
+ partition.accept(this);
+ }
+
+ accept(x.getQuery());
+
return false;
}
@@ -272,4 +283,19 @@ public class OdpsSchemaStatVisitor extends SchemaStatVisitor implements OdpsASTV
public boolean visit(OdpsLateralViewTableSource x) {
return true;
}
+
+ @Override
+ public void endVisit(OdpsValuesTableSource x) {
+
+ }
+
+ @Override
+ public boolean visit(OdpsValuesTableSource x) {
+ Map aliasMap = getAliasMap();
+ if (aliasMap != null && x.getAlias() != null) {
+ putAliasMap(aliasMap, x.getAlias(), null);
+ addSubQuery(x.getAlias(), x);
+ }
+ return false;
+ }
}
diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java
index 159d893081..efce85b0ac 100644
--- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java
+++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java
@@ -1927,6 +1927,30 @@ public class SQLStatementParser extends SQLParser {
createView.setOrReplace(true);
}
+ if (identifierEquals("ALGORITHM")) {
+ lexer.nextToken();
+ accept(Token.EQ);
+ String algorithm = lexer.stringVal();
+ createView.setAlgorithm(algorithm);
+ lexer.nextToken();
+ }
+
+ if (identifierEquals("DEFINER")) {
+ lexer.nextToken();
+ accept(Token.EQ);
+ SQLName definer = this.exprParser.name();
+ createView.setDefiner(definer);
+ lexer.nextToken();
+ }
+
+ if (identifierEquals("SQL")) {
+ lexer.nextToken();
+ acceptIdentifier("SECURITY");
+ String sqlSecurity = lexer.stringVal();
+ createView.setSqlSecurity(sqlSecurity);
+ lexer.nextToken();
+ }
+
this.accept(Token.VIEW);
if (lexer.token() == Token.IF || identifierEquals("IF")) {
diff --git a/src/main/java/com/alibaba/druid/sql/parser/Token.java b/src/main/java/com/alibaba/druid/sql/parser/Token.java
index e1390c39bc..bcefc7cc6e 100644
--- a/src/main/java/com/alibaba/druid/sql/parser/Token.java
+++ b/src/main/java/com/alibaba/druid/sql/parser/Token.java
@@ -306,7 +306,7 @@ public enum Token {
TILDE_STAR("~*"),
TILDE_EQ("~="),
QUES("?"),
- QUESQUES("??"),
+ QUESQUES("??"),
QUESBAR("?|"),
QUESAMP("?&"),
COLON(":"),
diff --git a/src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java
index f3faebbfd2..55debe4a88 100644
--- a/src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java
+++ b/src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java
@@ -15,9 +15,11 @@
*/
package com.alibaba.druid.sql.visitor;
+import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLExpr;
+import com.alibaba.druid.sql.ast.SQLObject;
import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr;
@@ -86,21 +88,46 @@ public final class ExportParameterVisitorUtils {
}
public static SQLExpr exportParameter(final List