mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improved sql parser.
This commit is contained in:
@@ -31,6 +31,11 @@ public class SQLLimit extends SQLObjectImpl {
|
||||
this.setRowCount(rowCount);
|
||||
}
|
||||
|
||||
public SQLLimit(SQLExpr offset, SQLExpr rowCount) {
|
||||
this.setOffset(offset);
|
||||
this.setRowCount(rowCount);
|
||||
}
|
||||
|
||||
private SQLExpr rowCount;
|
||||
private SQLExpr offset;
|
||||
|
||||
|
||||
@@ -145,6 +145,10 @@ public class SQLBinaryOpExpr extends SQLExprImpl implements Serializable {
|
||||
return true;
|
||||
}
|
||||
|
||||
public SQLBinaryOpExpr clone() {
|
||||
return new SQLBinaryOpExpr(left, operator, right, dbType);
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return SQLUtils.toSQLString(this, getDbType());
|
||||
}
|
||||
|
||||
@@ -82,4 +82,8 @@ public class SQLIntegerExpr extends SQLNumericLiteralExpr implements SQLValuable
|
||||
public Object getValue() {
|
||||
return this.number;
|
||||
}
|
||||
|
||||
public SQLIntegerExpr clone() {
|
||||
return new SQLIntegerExpr(this.number);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -104,4 +104,7 @@ public class SQLVariantRefExpr extends SQLExprImpl {
|
||||
this.global = global;
|
||||
}
|
||||
|
||||
public SQLVariantRefExpr clone() {
|
||||
return new SQLVariantRefExpr(name, global);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,15 +21,29 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor;
|
||||
|
||||
public class SQLAlterTableRename extends SQLObjectImpl implements SQLAlterTableItem {
|
||||
|
||||
protected SQLExpr to;
|
||||
protected SQLExprTableSource to;
|
||||
|
||||
public SQLExpr getTo() {
|
||||
public SQLAlterTableRename() {
|
||||
|
||||
}
|
||||
|
||||
public SQLAlterTableRename(SQLExpr to) {
|
||||
this.setTo(to);
|
||||
}
|
||||
|
||||
public SQLExprTableSource getTo() {
|
||||
return to;
|
||||
}
|
||||
|
||||
public void setTo(SQLExpr to) {
|
||||
public void setTo(SQLExprTableSource to) {
|
||||
if (to != null) {
|
||||
to.setParent(this);
|
||||
}
|
||||
this.to = to;
|
||||
to.setParent(this);
|
||||
}
|
||||
|
||||
public void setTo(SQLExpr to) {
|
||||
this.setTo(new SQLExprTableSource(to));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -20,9 +20,12 @@ import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.SQLObject;
|
||||
import com.alibaba.druid.sql.ast.SQLStatementImpl;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
|
||||
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
|
||||
|
||||
public class SQLAlterTableStatement extends SQLStatementImpl implements SQLDDLStatement {
|
||||
@@ -118,6 +121,10 @@ public class SQLAlterTableStatement extends SQLStatementImpl implements SQLDDLSt
|
||||
this.tableSource = tableSource;
|
||||
}
|
||||
|
||||
public void setTableSource(SQLExpr table) {
|
||||
this.setTableSource(new SQLExprTableSource(table));
|
||||
}
|
||||
|
||||
public SQLName getName() {
|
||||
if (getTableSource() == null) {
|
||||
return null;
|
||||
@@ -141,4 +148,18 @@ public class SQLAlterTableStatement extends SQLStatementImpl implements SQLDDLSt
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public String getTableName() {
|
||||
if (tableSource == null) {
|
||||
return null;
|
||||
}
|
||||
SQLExpr expr = ((SQLExprTableSource) tableSource).getExpr();
|
||||
if (expr instanceof SQLIdentifierExpr) {
|
||||
return ((SQLIdentifierExpr) expr).getName();
|
||||
} else if (expr instanceof SQLPropertyExpr) {
|
||||
return ((SQLPropertyExpr) expr).getName();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,6 +22,8 @@ import com.alibaba.druid.sql.ast.SQLDataType;
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.SQLObjectImpl;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
|
||||
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
|
||||
|
||||
public class SQLColumnDefinition extends SQLObjectImpl implements SQLTableElement {
|
||||
@@ -259,4 +261,24 @@ public class SQLColumnDefinition extends SQLObjectImpl implements SQLTableElemen
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public String computeAlias() {
|
||||
String alias = null;
|
||||
|
||||
if (name instanceof SQLIdentifierExpr) {
|
||||
alias = ((SQLIdentifierExpr) name).getName();
|
||||
} else if (name instanceof SQLPropertyExpr) {
|
||||
alias = ((SQLPropertyExpr) name).getName();
|
||||
}
|
||||
|
||||
if (alias.length() > 2) {
|
||||
char c0 = alias.charAt(0);
|
||||
char x0 = alias.charAt(alias.length() - 1);
|
||||
if ((c0 == '"' && x0 == '"') || (c0 == '`' && x0 == '`')) {
|
||||
alias = alias.substring(1, alias.length() - 1);
|
||||
}
|
||||
}
|
||||
|
||||
return alias;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,8 +18,11 @@ package com.alibaba.druid.sql.ast.statement;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.SQLStatementImpl;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
|
||||
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
|
||||
|
||||
public class SQLCreateIndexStatement extends SQLStatementImpl implements SQLDDLStatement {
|
||||
@@ -55,6 +58,19 @@ public class SQLCreateIndexStatement extends SQLStatementImpl implements SQLDDLS
|
||||
this.table = table;
|
||||
}
|
||||
|
||||
public String getTableName() {
|
||||
if (table instanceof SQLExprTableSource) {
|
||||
SQLExpr expr = ((SQLExprTableSource) table).getExpr();
|
||||
if (expr instanceof SQLIdentifierExpr) {
|
||||
return ((SQLIdentifierExpr) expr).getName();
|
||||
} else if (expr instanceof SQLPropertyExpr) {
|
||||
return ((SQLPropertyExpr) expr).getName();
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public List<SQLSelectOrderByItem> getItems() {
|
||||
return items;
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor;
|
||||
public class SQLDropSequenceStatement extends SQLStatementImpl implements SQLDDLStatement {
|
||||
|
||||
private SQLName name;
|
||||
private boolean ifExists;
|
||||
|
||||
public SQLDropSequenceStatement() {
|
||||
|
||||
@@ -47,4 +48,11 @@ public class SQLDropSequenceStatement extends SQLStatementImpl implements SQLDDL
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public boolean isIfExists() {
|
||||
return ifExists;
|
||||
}
|
||||
|
||||
public void setIfExists(boolean ifExists) {
|
||||
this.ifExists = ifExists;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,8 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor;
|
||||
public class SQLDropTriggerStatement extends SQLStatementImpl implements SQLDDLStatement {
|
||||
|
||||
private SQLName name;
|
||||
|
||||
private boolean ifExists;
|
||||
|
||||
public SQLDropTriggerStatement() {
|
||||
|
||||
}
|
||||
@@ -47,4 +48,11 @@ public class SQLDropTriggerStatement extends SQLStatementImpl implements SQLDDLS
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public boolean isIfExists() {
|
||||
return ifExists;
|
||||
}
|
||||
|
||||
public void setIfExists(boolean ifExists) {
|
||||
this.ifExists = ifExists;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,6 +47,9 @@ public class SQLIfStatement extends SQLStatementImpl {
|
||||
}
|
||||
|
||||
public void setCondition(SQLExpr condition) {
|
||||
if (condition != null) {
|
||||
condition.setParent(this);
|
||||
}
|
||||
this.condition = condition;
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ public class SQLLoopStatement extends SQLStatementImpl {
|
||||
|
||||
private String labelName;
|
||||
|
||||
private List<SQLStatement> statements = new ArrayList<SQLStatement>();
|
||||
private final List<SQLStatement> statements = new ArrayList<SQLStatement>();
|
||||
|
||||
@Override
|
||||
public void accept0(SQLASTVisitor visitor) {
|
||||
@@ -40,10 +40,6 @@ public class SQLLoopStatement extends SQLStatementImpl {
|
||||
return statements;
|
||||
}
|
||||
|
||||
public void setStatements(List<SQLStatement> statements) {
|
||||
this.statements = statements;
|
||||
}
|
||||
|
||||
public String getLabelName() {
|
||||
return labelName;
|
||||
}
|
||||
|
||||
@@ -17,6 +17,8 @@ package com.alibaba.druid.sql.ast.statement;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLObjectImpl;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
|
||||
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
|
||||
|
||||
public class SQLSelectItem extends SQLObjectImpl {
|
||||
@@ -63,6 +65,27 @@ public class SQLSelectItem extends SQLObjectImpl {
|
||||
}
|
||||
}
|
||||
|
||||
public String computeAlias() {
|
||||
String alias = this.getAlias();
|
||||
if (alias == null) {
|
||||
if (expr instanceof SQLIdentifierExpr) {
|
||||
alias = ((SQLIdentifierExpr) expr).getName();
|
||||
} else if (expr instanceof SQLPropertyExpr) {
|
||||
alias = ((SQLPropertyExpr) expr).getName();
|
||||
}
|
||||
}
|
||||
|
||||
if (alias.length() > 2) {
|
||||
char c0 = alias.charAt(0);
|
||||
char x0 = alias.charAt(alias.length() - 1);
|
||||
if ((c0 == '"' && x0 == '"') || (c0 == '`' && x0 == '`')) {
|
||||
alias = alias.substring(1, alias.length() - 1);
|
||||
}
|
||||
}
|
||||
|
||||
return alias;
|
||||
}
|
||||
|
||||
public String getAlias() {
|
||||
return this.alias;
|
||||
}
|
||||
|
||||
@@ -395,9 +395,7 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.TRIGGER) {
|
||||
if (replace) {
|
||||
lexer.reset(markBp, markChar, Token.CREATE);
|
||||
}
|
||||
lexer.reset(markBp, markChar, Token.CREATE);
|
||||
return parseCreateTrigger();
|
||||
}
|
||||
// parse create procedure
|
||||
@@ -3011,18 +3009,24 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
item.addColumn(name);
|
||||
|
||||
while (lexer.token() == Token.COMMA) {
|
||||
lexer.mark();
|
||||
char markChar = lexer.current();
|
||||
int markBp = lexer.bp();
|
||||
|
||||
lexer.nextToken();
|
||||
if (identifierEquals("CHANGE")) {
|
||||
lexer.reset();
|
||||
lexer.reset(markBp, markChar, Token.COMMA);
|
||||
break;
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.IDENTIFIER) {
|
||||
if ("ADD".equalsIgnoreCase(lexer.stringVal())) {
|
||||
lexer.reset(markBp, markChar, Token.COMMA);
|
||||
break;
|
||||
}
|
||||
name = exprParser.name();
|
||||
name.setParent(item);
|
||||
} else {
|
||||
lexer.reset();
|
||||
lexer.reset(markBp, markChar, Token.COMMA);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -3561,6 +3565,7 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
accept(Token.END);
|
||||
accept(Token.IF);
|
||||
accept(Token.SEMI);
|
||||
stmt.setAfterSemi(true);
|
||||
|
||||
return stmt;
|
||||
}
|
||||
@@ -3770,6 +3775,7 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
accept(Token.END);
|
||||
accept(Token.LOOP);
|
||||
accept(Token.SEMI);
|
||||
loopStmt.setAfterSemi(true);
|
||||
return loopStmt;
|
||||
}
|
||||
|
||||
@@ -3787,6 +3793,7 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
acceptIdentifier(label);
|
||||
}
|
||||
accept(Token.SEMI);
|
||||
loopStmt.setAfterSemi(true);
|
||||
return loopStmt;
|
||||
}
|
||||
|
||||
|
||||
@@ -15,14 +15,7 @@
|
||||
*/
|
||||
package com.alibaba.druid.sql.dialect.mysql.visitor;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLCommentHint;
|
||||
import com.alibaba.druid.sql.ast.SQLDataType;
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLObject;
|
||||
import com.alibaba.druid.sql.ast.SQLOrderBy;
|
||||
import com.alibaba.druid.sql.ast.SQLParameter;
|
||||
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.ast.*;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
|
||||
@@ -380,12 +373,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
|
||||
}
|
||||
|
||||
public boolean visit(SQLDataType x) {
|
||||
print0(x.getName());
|
||||
if (!x.getArguments().isEmpty()) {
|
||||
print('(');
|
||||
printAndAccept(x.getArguments(), ", ");
|
||||
print(')');
|
||||
}
|
||||
printDataType(x);
|
||||
|
||||
if (Boolean.TRUE == x.getAttribute("UNSIGNED")) {
|
||||
print0(ucase ? " UNSIGNED" : " unsigned");
|
||||
@@ -3284,6 +3272,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
|
||||
@Override
|
||||
public boolean visit(SQLIfStatement.Else x) {
|
||||
print0(ucase ? "ELSE " : "else ");
|
||||
incrementIndent();
|
||||
println();
|
||||
for (int i = 0, size = x.getStatements().size(); i < size; ++i) {
|
||||
SQLStatement item = x.getStatements().get(i);
|
||||
@@ -3293,6 +3282,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
|
||||
println();
|
||||
}
|
||||
}
|
||||
decrementIndent();
|
||||
println();
|
||||
return false;
|
||||
}
|
||||
@@ -3617,4 +3607,24 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
|
||||
public void endVisit(MySqlDeclareConditionStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLAlterTableDropColumnItem x) {
|
||||
|
||||
for (int i = 0; i < x.getColumns().size(); ++i) {
|
||||
if (i != 0) {
|
||||
print0(", ");
|
||||
}
|
||||
|
||||
SQLName columnn = x.getColumns().get(i);
|
||||
|
||||
print0(ucase ? "DROP COLUMN " : "drop column ");
|
||||
columnn.accept(this);
|
||||
|
||||
if (x.isCascade()) {
|
||||
print0(ucase ? " CASCADE" : " cascade");
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
} //
|
||||
|
||||
+4
-8
@@ -19,10 +19,10 @@ import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleConntinueStatement extends OracleStatementImpl {
|
||||
public class OracleContinueStatement extends OracleStatementImpl {
|
||||
|
||||
private SQLExpr when;
|
||||
private SQLName label;
|
||||
private String label;
|
||||
|
||||
public SQLExpr getWhen() {
|
||||
return when;
|
||||
@@ -35,21 +35,17 @@ public class OracleConntinueStatement extends OracleStatementImpl {
|
||||
this.when = when;
|
||||
}
|
||||
|
||||
public SQLName getLabel() {
|
||||
public String getLabel() {
|
||||
return label;
|
||||
}
|
||||
|
||||
public void setLabel(SQLName label) {
|
||||
if (label != null) {
|
||||
label.setParent(this);
|
||||
}
|
||||
public void setLabel(String label) {
|
||||
this.label = label;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, label);
|
||||
acceptChild(visitor, when);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright 1999-2017 Alibaba Group Holding Ltd.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleExecuteImmediateStatement extends OracleStatementImpl {
|
||||
|
||||
private SQLCharExpr dynamicSql;
|
||||
|
||||
public OracleExecuteImmediateStatement(){
|
||||
}
|
||||
|
||||
public OracleExecuteImmediateStatement(String dynamicSql){
|
||||
this.setDynamicSql(dynamicSql);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
// acceptChild(visitor, label);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public SQLCharExpr getDynamicSql() {
|
||||
return dynamicSql;
|
||||
}
|
||||
|
||||
public void setDynamicSql(SQLCharExpr dynamicSql) {
|
||||
if (dynamicSql != null) {
|
||||
dynamicSql.setParent(this);
|
||||
}
|
||||
this.dynamicSql = dynamicSql;
|
||||
}
|
||||
|
||||
public void setDynamicSql(String dynamicSql) {
|
||||
this.setDynamicSql(new SQLCharExpr(dynamicSql));
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,7 @@ import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleExitStatement extends OracleStatementImpl {
|
||||
private String label;
|
||||
|
||||
private SQLExpr when;
|
||||
|
||||
@@ -41,4 +42,11 @@ public class OracleExitStatement extends OracleStatementImpl {
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public String getLabel() {
|
||||
return label;
|
||||
}
|
||||
|
||||
public void setLabel(String label) {
|
||||
this.label = label;
|
||||
}
|
||||
}
|
||||
|
||||
+12
-3
@@ -17,11 +17,12 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleLockTableStatement extends OracleStatementImpl {
|
||||
|
||||
private SQLName table;
|
||||
private SQLExprTableSource table;
|
||||
private LockMode lockMode;
|
||||
private boolean noWait = false;
|
||||
private SQLExpr wait;
|
||||
@@ -42,14 +43,22 @@ public class OracleLockTableStatement extends OracleStatementImpl {
|
||||
this.wait = wait;
|
||||
}
|
||||
|
||||
public SQLName getTable() {
|
||||
public SQLExprTableSource getTable() {
|
||||
return table;
|
||||
}
|
||||
|
||||
public void setTable(SQLName table) {
|
||||
public void setTable(SQLExprTableSource table) {
|
||||
if (table != null) {
|
||||
table.setParent(this);
|
||||
}
|
||||
this.table = table;
|
||||
}
|
||||
|
||||
public void setTable(SQLName table) {
|
||||
this.setTable(new SQLExprTableSource(table));
|
||||
this.table.setParent(this);
|
||||
}
|
||||
|
||||
public LockMode getLockMode() {
|
||||
return lockMode;
|
||||
}
|
||||
|
||||
+102
-11
@@ -217,11 +217,7 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
|
||||
if (identifierEquals("EXIT")) {
|
||||
lexer.nextToken();
|
||||
OracleExitStatement stmt = new OracleExitStatement();
|
||||
if (lexer.token() == Token.WHEN) {
|
||||
lexer.nextToken();
|
||||
stmt.setWhen(this.exprParser.expr());
|
||||
}
|
||||
OracleExitStatement stmt = parseExit();
|
||||
stmt.setParent(parent);
|
||||
statementList.add(stmt);
|
||||
continue;
|
||||
@@ -229,10 +225,11 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
|
||||
if (lexer.token() == Token.CONTINUE) {
|
||||
lexer.nextToken();
|
||||
OracleConntinueStatement stmt = new OracleConntinueStatement();
|
||||
OracleContinueStatement stmt = new OracleContinueStatement();
|
||||
|
||||
if (lexer.token() == Token.IDENTIFIER) {
|
||||
SQLName label = this.exprParser.name();
|
||||
String label = lexer.stringVal();
|
||||
lexer.nextToken();
|
||||
stmt.setLabel(label);
|
||||
}
|
||||
if (lexer.token() == Token.WHEN) {
|
||||
@@ -268,17 +265,52 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
if (lexer.token() == Token.IDENTIFIER) {
|
||||
String strVal = lexer.stringVal();
|
||||
if (strVal.equalsIgnoreCase("RAISE")) {
|
||||
statementList.add(this.parseRaise());
|
||||
SQLStatement stmt = this.parseRaise();
|
||||
stmt.setParent(parent);
|
||||
statementList.add(stmt);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strVal.equalsIgnoreCase("FORALL")) {
|
||||
SQLStatement forAll = this.parseFor();
|
||||
statementList.add(forAll);
|
||||
SQLStatement stmt = this.parseFor();
|
||||
stmt.setParent(parent);
|
||||
statementList.add(stmt);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strVal.equalsIgnoreCase("RENAME")) {
|
||||
SQLStatement stmt = this.parseRename();
|
||||
stmt.setParent(parent);
|
||||
statementList.add(stmt);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strVal.equalsIgnoreCase("EXECUTE")) {
|
||||
SQLStatement stmt = this.parseExecute();
|
||||
stmt.setParent(parent);
|
||||
statementList.add(stmt);
|
||||
continue;
|
||||
}
|
||||
|
||||
SQLExpr expr = exprParser.expr();
|
||||
|
||||
if (expr instanceof SQLBinaryOpExpr) {
|
||||
SQLBinaryOpExpr binaryOpExpr = (SQLBinaryOpExpr) expr;
|
||||
if (binaryOpExpr.getOperator() == SQLBinaryOperator.Assignment) {
|
||||
SQLSetStatement stmt = new SQLSetStatement();
|
||||
stmt.setDbType(JdbcConstants.ORACLE);
|
||||
stmt.setParent(parent);
|
||||
|
||||
SQLAssignItem assignItem = new SQLAssignItem(binaryOpExpr.getLeft(), binaryOpExpr.getRight());
|
||||
assignItem.setParent(stmt);
|
||||
stmt.getItems().add(assignItem);
|
||||
|
||||
statementList.add(stmt);
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
OracleExprStatement stmt = new OracleExprStatement(expr);
|
||||
stmt.setParent(parent);
|
||||
statementList.add(stmt);
|
||||
@@ -584,6 +616,53 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
}
|
||||
}
|
||||
|
||||
public SQLStatement parseExecute() {
|
||||
acceptIdentifier("EXECUTE");
|
||||
|
||||
if (lexer.token() == Token.IMMEDIATE) {
|
||||
lexer.nextToken();
|
||||
|
||||
OracleExecuteImmediateStatement stmt = new OracleExecuteImmediateStatement();
|
||||
String dyanmiacSql = lexer.stringVal();
|
||||
accept(Token.LITERAL_CHARS);
|
||||
stmt.setDynamicSql(dyanmiacSql);
|
||||
return stmt;
|
||||
}
|
||||
throw new ParserException("TODO : " + lexer.info());
|
||||
}
|
||||
|
||||
public SQLStatement parseRename() {
|
||||
lexer.nextToken();
|
||||
SQLName from = this.exprParser.name();
|
||||
accept(Token.TO);
|
||||
SQLName to = this.exprParser.name();
|
||||
|
||||
SQLAlterTableStatement stmt = new SQLAlterTableStatement();
|
||||
stmt.setTableSource(from);
|
||||
SQLAlterTableRename toItem = new SQLAlterTableRename(to);
|
||||
stmt.addItem(toItem);
|
||||
|
||||
return stmt;
|
||||
}
|
||||
|
||||
private OracleExitStatement parseExit() {
|
||||
OracleExitStatement stmt = new OracleExitStatement();
|
||||
|
||||
if (lexer.token() == Token.IDENTIFIER) {
|
||||
String label = lexer.stringVal();
|
||||
stmt.setLabel(label);
|
||||
lexer.nextToken();
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.WHEN) {
|
||||
lexer.nextToken();
|
||||
stmt.setWhen(this.exprParser.expr());
|
||||
}
|
||||
accept(Token.SEMI);
|
||||
stmt.setAfterSemi(true);
|
||||
return stmt;
|
||||
}
|
||||
|
||||
public SQLStatement parseReturn() {
|
||||
accept(Token.RETURN);
|
||||
SQLReturnStatement stmt = new SQLReturnStatement();
|
||||
@@ -790,6 +869,7 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
// lexer.nextToken();
|
||||
// }
|
||||
accept(Token.SEMI);
|
||||
stmt.setAfterSemi(true);
|
||||
|
||||
return stmt;
|
||||
}
|
||||
@@ -838,6 +918,15 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
this.parseStatementList(stmt.getStatements(), -1, stmt);
|
||||
accept(Token.END);
|
||||
accept(Token.LOOP);
|
||||
|
||||
if (lexer.token() == Token.IDENTIFIER) {
|
||||
String label = lexer.stringVal();
|
||||
stmt.setLabelName(label);
|
||||
lexer.nextToken();
|
||||
}
|
||||
|
||||
accept(Token.SEMI);
|
||||
stmt.setAfterSemi(true);
|
||||
return stmt;
|
||||
}
|
||||
|
||||
@@ -2034,8 +2123,10 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
|
||||
varDecl.getItems().add(varItem);
|
||||
|
||||
stmt.getStatements().add(varDecl);
|
||||
accept(Token.SEMI);
|
||||
varDecl.setAfterSemi(true);
|
||||
|
||||
stmt.getStatements().add(varDecl);
|
||||
} else if (lexer.token() == Token.FUNCTION) {
|
||||
SQLStatement function = this.parseFunction();
|
||||
function.setParent(stmt);
|
||||
|
||||
@@ -389,9 +389,9 @@ public interface OracleASTVisitor extends SQLASTVisitor {
|
||||
|
||||
void endVisit(OracleExitStatement x);
|
||||
|
||||
boolean visit(OracleConntinueStatement x);
|
||||
boolean visit(OracleContinueStatement x);
|
||||
|
||||
void endVisit(OracleConntinueStatement x);
|
||||
void endVisit(OracleContinueStatement x);
|
||||
|
||||
boolean visit(OracleRaiseStatement x);
|
||||
|
||||
@@ -460,4 +460,8 @@ public interface OracleASTVisitor extends SQLASTVisitor {
|
||||
boolean visit(OracleCreatePackageStatement x);
|
||||
|
||||
void endVisit(OracleCreatePackageStatement x);
|
||||
|
||||
boolean visit(OracleExecuteImmediateStatement x);
|
||||
|
||||
void endVisit(OracleExecuteImmediateStatement x);
|
||||
}
|
||||
|
||||
+12
-2
@@ -938,12 +938,12 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleConntinueStatement x) {
|
||||
public boolean visit(OracleContinueStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleConntinueStatement x) {
|
||||
public void endVisit(OracleContinueStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@@ -1109,4 +1109,14 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora
|
||||
public void endVisit(OracleCreatePackageStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleExecuteImmediateStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleExecuteImmediateStatement x) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+52
-8
@@ -28,7 +28,6 @@ import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSegmentAttributes;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause;
|
||||
@@ -1469,7 +1468,12 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
if (x.getStatements().size() > 1) {
|
||||
println();
|
||||
} else {
|
||||
print(' ');
|
||||
if (x.getStatements().size() == 1
|
||||
&& x.getStatements().get(0) instanceof SQLIfStatement) {
|
||||
println();
|
||||
} else {
|
||||
print(' ');
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0, size = x.getStatements().size(); i < size; ++i) {
|
||||
@@ -1594,6 +1598,19 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLAlterTableStatement x) {
|
||||
if (x.getItems().size() == 1) {
|
||||
SQLAlterTableItem item = x.getItems().get(0);
|
||||
if (item instanceof SQLAlterTableRename) {
|
||||
SQLExpr to = ((SQLAlterTableRename) item).getTo().getExpr();
|
||||
|
||||
print0(ucase ? "RENAME " : "rename ");
|
||||
x.getName().accept(this);
|
||||
print0(ucase ? " TO " : "to ");
|
||||
to.accept(this);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
print0(ucase ? "ALTER TABLE " : "alter table ");
|
||||
printTableSourceExpr(x.getName());
|
||||
incrementIndent();
|
||||
@@ -1958,7 +1975,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
x.getElseItem().accept(this);
|
||||
}
|
||||
println();
|
||||
print0(ucase ? "END IF;" : "end if;");
|
||||
print0(ucase ? "END IF" : "end if");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -2043,7 +2060,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleCreateTableStatement x) {
|
||||
this.visit((SQLCreateTableStatement) x);
|
||||
printCreateTable(x);
|
||||
|
||||
if (x.getOf() != null) {
|
||||
println();
|
||||
@@ -2431,6 +2448,12 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
@Override
|
||||
public boolean visit(OracleExitStatement x) {
|
||||
print0(ucase ? "EXIT" : "exit");
|
||||
|
||||
if (x.getLabel() != null) {
|
||||
print(' ');
|
||||
print0(x.getLabel());
|
||||
}
|
||||
|
||||
if (x.getWhen() != null) {
|
||||
print0(ucase ? " WHEN " : " when ");
|
||||
x.getWhen().accept(this);
|
||||
@@ -2445,13 +2468,13 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleConntinueStatement x) {
|
||||
public boolean visit(OracleContinueStatement x) {
|
||||
print0(ucase ? "CONTINUE" : "continue");
|
||||
|
||||
SQLName label = x.getLabel();
|
||||
String label = x.getLabel();
|
||||
if (label != null) {
|
||||
print(' ');
|
||||
label.accept(this);
|
||||
print0(label);
|
||||
}
|
||||
|
||||
if (x.getWhen() != null) {
|
||||
@@ -2462,7 +2485,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleConntinueStatement x) {
|
||||
public void endVisit(OracleContinueStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@@ -3189,4 +3212,25 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
public void endVisit(OracleCreatePackageStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLAssignItem x) {
|
||||
x.getTarget().accept(this);
|
||||
print0(" := ");
|
||||
x.getValue().accept(this);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleExecuteImmediateStatement x) {
|
||||
print0(ucase ? "EXECUTE IMMEDIATE " : "execute immediate ");
|
||||
x.getDynamicSql().accept(this);
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleExecuteImmediateStatement x) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+21
-2
@@ -19,9 +19,11 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.alibaba.druid.sql.SQLUtils;
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.SQLObject;
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
|
||||
@@ -84,6 +86,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot.Item;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.CheckOption;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.ReadOnly;
|
||||
import com.alibaba.druid.sql.parser.SQLParserUtils;
|
||||
import com.alibaba.druid.sql.visitor.SchemaStatVisitor;
|
||||
import com.alibaba.druid.stat.TableStat;
|
||||
import com.alibaba.druid.stat.TableStat.Column;
|
||||
@@ -1271,12 +1274,12 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleConntinueStatement x) {
|
||||
public boolean visit(OracleContinueStatement x) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleConntinueStatement x) {
|
||||
public void endVisit(OracleContinueStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@@ -1447,4 +1450,20 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
public void endVisit(OracleCreatePackageStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleExecuteImmediateStatement x) {
|
||||
String sql = x.getDynamicSql().getText();
|
||||
|
||||
List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, getDbType());
|
||||
for (SQLStatement stmt : stmtList) {
|
||||
stmt.accept(this);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleExecuteImmediateStatement x) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1904,8 +1904,11 @@ public class SQLExprParser extends SQLParser {
|
||||
SQLColumnDefinition column = createColumnDefinition();
|
||||
column.setName(name());
|
||||
|
||||
if (lexer.token() != Token.SET //
|
||||
&& lexer.token() != Token.DROP) {
|
||||
final Token token = lexer.token();
|
||||
if (token != Token.SET //
|
||||
&& token != Token.DROP
|
||||
&& token != Token.PRIMARY
|
||||
&& token != Token.RPAREN) {
|
||||
column.setDataType(parseDataType());
|
||||
}
|
||||
return parseColumnRest(column);
|
||||
|
||||
@@ -1700,6 +1700,11 @@ public class SQLStatementParser extends SQLParser {
|
||||
return parseCreateView();
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.TRIGGER) {
|
||||
lexer.reset(markBp, markChar, Token.CREATE);
|
||||
return parseCreateTrigger();
|
||||
}
|
||||
|
||||
if (identifierEquals("PACKAGE")) {
|
||||
lexer.reset(markBp, markChar, Token.CREATE);
|
||||
return parseCreatePackage();
|
||||
@@ -1722,6 +1727,7 @@ public class SQLStatementParser extends SQLParser {
|
||||
} else if (token == Token.VIEW) {
|
||||
return parseCreateView();
|
||||
} else if (token == Token.TRIGGER) {
|
||||
lexer.reset(markBp, markChar, Token.CREATE);
|
||||
return parseCreateTrigger();
|
||||
} else if (token == Token.PROCEDURE) {
|
||||
SQLCreateProcedureStatement stmt = parseCreateProcedure();
|
||||
@@ -1737,9 +1743,20 @@ public class SQLStatementParser extends SQLParser {
|
||||
}
|
||||
|
||||
public SQLStatement parseCreateTrigger() {
|
||||
accept(Token.TRIGGER);
|
||||
accept(Token.CREATE);
|
||||
|
||||
SQLCreateTriggerStatement stmt = new SQLCreateTriggerStatement(getDbType());
|
||||
|
||||
if (lexer.token() == Token.OR) {
|
||||
lexer.nextToken();
|
||||
accept(Token.REPLACE);
|
||||
|
||||
stmt.setOrReplace(true);
|
||||
}
|
||||
|
||||
accept(Token.TRIGGER);
|
||||
|
||||
|
||||
stmt.setName(this.exprParser.name());
|
||||
|
||||
if (identifierEquals("BEFORE")) {
|
||||
|
||||
@@ -1159,6 +1159,12 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
|
||||
|
||||
printSelectList(x.getSelectList());
|
||||
|
||||
if (x.getInto() != null) {
|
||||
println();
|
||||
print0(ucase ? "INTO " : "into ");
|
||||
x.getInto().accept(this);
|
||||
}
|
||||
|
||||
if (x.getFrom() != null) {
|
||||
println();
|
||||
print0(ucase ? "FROM " : "from ");
|
||||
@@ -1751,6 +1757,12 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
|
||||
}
|
||||
|
||||
public boolean visit(SQLCreateTableStatement x) {
|
||||
printCreateTable(x);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
protected void printCreateTable(SQLCreateTableStatement x) {
|
||||
print0(ucase ? "CREATE TABLE " : "create table ");
|
||||
if (SQLCreateTableStatement.Type.GLOBAL_TEMPORARY.equals(x.getType())) {
|
||||
print0(ucase ? "GLOBAL TEMPORARY " : "global temporary ");
|
||||
@@ -1767,8 +1779,6 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
|
||||
x.getInherits().accept(this);
|
||||
print(')');
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean visit(SQLUniqueConstraint x) {
|
||||
@@ -1912,7 +1922,9 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLSetStatement x) {
|
||||
print0(ucase ? "SET " : "set ");
|
||||
if (!JdbcConstants.ORACLE.equals(dbType)) {
|
||||
print0(ucase ? "SET " : "set ");
|
||||
}
|
||||
printAndAccept(x.getItems(), ", ");
|
||||
|
||||
if (x.getHints() != null && x.getHints().size() > 0) {
|
||||
@@ -2749,6 +2761,9 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
|
||||
@Override
|
||||
public boolean visit(SQLDropSequenceStatement x) {
|
||||
print0(ucase ? "DROP SEQUENCE " : "drop sequence ");
|
||||
if (x.isIfExists()) {
|
||||
print0(ucase ? "IF EXISTS " : "if exists ");
|
||||
}
|
||||
x.getName().accept(this);
|
||||
return false;
|
||||
}
|
||||
@@ -2761,6 +2776,10 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
|
||||
@Override
|
||||
public boolean visit(SQLDropTriggerStatement x) {
|
||||
print0(ucase ? "DROP TRIGGER " : "drop trigger ");
|
||||
if (x.isIfExists()) {
|
||||
print0(ucase ? "IF EXISTS " : "if exists ");
|
||||
}
|
||||
|
||||
x.getName().accept(this);
|
||||
return false;
|
||||
}
|
||||
@@ -3406,6 +3425,10 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
|
||||
decrementIndent();
|
||||
println();
|
||||
print0(ucase ? "END LOOP" : "end loop");
|
||||
if (x.getLabelName() != null) {
|
||||
print(' ');
|
||||
print0(x.getLabelName());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -3469,15 +3492,19 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
|
||||
|
||||
dataType.accept(this);
|
||||
|
||||
if (x.getDefaultValue() != null) {
|
||||
print0(" := ");
|
||||
x.getDefaultValue().accept(this);
|
||||
}
|
||||
printParamDefaultValue(x);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
protected void printParamDefaultValue(SQLParameter x) {
|
||||
if (x.getDefaultValue() != null) {
|
||||
print0(" := ");
|
||||
x.getDefaultValue().accept(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLDeclareItem x) {
|
||||
x.getName().accept(this);
|
||||
|
||||
Reference in New Issue
Block a user