Merge remote-tracking branch 'upstream/master'

This commit is contained in:
junyu
2014-07-11 20:53:06 +08:00
6 changed files with 138 additions and 1 deletions
@@ -23,6 +23,7 @@ public class SQLSelectItem extends SQLObjectImpl {
private SQLExpr expr;
private String alias;
private boolean connectByRoot = false;
public SQLSelectItem(){
@@ -40,6 +41,16 @@ public class SQLSelectItem extends SQLObjectImpl {
expr.setParent(this);
}
}
public SQLSelectItem(SQLExpr expr, String alias, boolean connectByRoot){
this.connectByRoot = connectByRoot;
this.expr = expr;
this.alias = alias;
if (expr != null) {
expr.setParent(this);
}
}
public SQLExpr getExpr() {
return this.expr;
@@ -61,6 +72,9 @@ public class SQLSelectItem extends SQLObjectImpl {
}
public void output(StringBuffer buf) {
if(this.connectByRoot) {
buf.append(" CONNECT_BY_ROOT ");
}
this.expr.output(buf);
if ((this.alias != null) && (this.alias.length() != 0)) {
buf.append(" AS ");
@@ -99,4 +113,12 @@ public class SQLSelectItem extends SQLObjectImpl {
return true;
}
public boolean isConnectByRoot() {
return connectByRoot;
}
public void setConnectByRoot(boolean connectByRoot) {
this.connectByRoot = connectByRoot;
}
}
@@ -306,6 +306,7 @@ public class SQLExprParser extends SQLParser {
case EXCLUSIVE:
case MODE:
case ADVISE:
case VIEW:
sqlExpr = new SQLIdentifierExpr(lexer.stringVal());
lexer.nextToken();
break;
@@ -284,7 +284,12 @@ public class SQLSelectParser extends SQLParser {
protected SQLSelectItem parseSelectItem() {
SQLExpr expr;
boolean connectByRoot = false;
if (lexer.token() == Token.IDENTIFIER) {
if (identifierEquals("CONNECT_BY_ROOT")) {
connectByRoot = true;
lexer.nextToken();
}
expr = new SQLIdentifierExpr(lexer.stringVal());
lexer.nextTokenComma();
@@ -297,7 +302,7 @@ public class SQLSelectParser extends SQLParser {
}
final String alias = as();
return new SQLSelectItem(expr, alias);
return new SQLSelectItem(expr, alias, connectByRoot);
}
public void parseFrom(SQLSelectQueryBlock queryBlock) {
@@ -697,6 +697,9 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab
}
public boolean visit(SQLSelectItem x) {
if(x.isConnectByRoot()) {
print("CONNECT_BY_ROOT ");
}
x.getExpr().accept(this);
if ((x.getAlias() != null) && (x.getAlias().length() > 0)) {
@@ -0,0 +1,54 @@
/*
* Copyright 1999-2011 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.bvt.sql.mysql;
import java.util.List;
import org.junit.Assert;
import com.alibaba.druid.sql.MysqlTest;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor;
import com.alibaba.druid.stat.TableStat;
import com.alibaba.druid.stat.TableStat.Column;
public class MySqlSelectTest_19 extends MysqlTest {
public void test_0() throws Exception {
String sql = "SELECT * FROM mj_list WHERE ( uid = 1 ) AND ( status = 1 ) ORDER BY view DESC LIMIT 10";
MySqlStatementParser parser = new MySqlStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
print(statementList);
Assert.assertEquals(1, statementList.size());
MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
statemen.accept(visitor);
System.out.println("Tables : " + visitor.getTables());
System.out.println("fields : " + visitor.getColumns());
System.out.println("coditions : " + visitor.getConditions());
System.out.println("orderBy : " + visitor.getOrderByColumns());
Assert.assertEquals(1, visitor.getTables().size());
Assert.assertEquals(4, visitor.getColumns().size());
Assert.assertEquals(2, visitor.getConditions().size());
Assert.assertEquals(1, visitor.getOrderByColumns().size());
}
}
@@ -0,0 +1,52 @@
/*
* Copyright 1999-2011 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.bvt.sql.oracle;
import java.util.List;
import org.junit.Assert;
import com.alibaba.druid.sql.OracleTest;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor;
public class OracleSelectTest_connect_by_root extends OracleTest {
public void test_0() throws Exception {
String sql = "select id, category_name, parent_id, root_id, (select category_name from mtn_contact_category where id = root_id) root_category_name from (select id, category_name, connect_by_root id root_id, parent_id, level lev from mtn_contact_category connect by prior id = parent_id) where lev = 3 ";
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement statemen = statementList.get(0);
print(statementList);
Assert.assertEquals(1, statementList.size());
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
statemen.accept(visitor);
System.out.println("Tables : " + visitor.getTables());
System.out.println("fields : " + visitor.getColumns());
System.out.println("coditions : " + visitor.getConditions());
System.out.println("relationships : " + visitor.getRelationships());
Assert.assertEquals(1, visitor.getTables().size());
// Assert.assertEquals(1, visitor.getColumns().size());
}
}