修正输出格式

git-svn-id: http://code.alibabatech.com/svn/druid/trunk@159 b9813039-fb51-4c41-a8b9-e21c2acb5095
This commit is contained in:
wenshao
2011-05-20 11:56:32 +00:00
parent edbaa3db38
commit 2b19baff03
18 changed files with 205 additions and 31 deletions
@@ -179,11 +179,12 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
}
if (select.getGroupBy() != null) {
println();
select.getGroupBy().accept(this);
}
if (select.getOrderBy() != null) {
print(" ");
println();
select.getOrderBy().accept(this);
}
@@ -2,10 +2,13 @@ package com.alibaba.druid.sql.dialect.mysql.visitor;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator;
import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLInListExpr;
import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr;
import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr;
import com.alibaba.druid.sql.ast.expr.SQLNCharExpr;
import com.alibaba.druid.sql.ast.expr.SQLNumberExpr;
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement;
@@ -40,7 +43,7 @@ public class MySqlParameterizedOutputVisitor extends MySqlOutputVisitor {
print(x.getRight().toString());
return false;
}
x = merge(x);
return super.visit(x);
@@ -92,6 +95,21 @@ public class MySqlParameterizedOutputVisitor extends MySqlOutputVisitor {
return false;
}
public boolean visit(SQLNumberExpr x) {
print('?');
return false;
}
public boolean visit(SQLCharExpr x) {
print('?');
return false;
}
public boolean visit(SQLNCharExpr x) {
print('?');
return false;
}
@Override
public boolean visit(MySqlInsertStatement x) {
print("INSERT ");
@@ -667,7 +667,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
}
if (select.getGroupBy() != null) {
print(" ");
println();
select.getGroupBy().accept(this);
}
@@ -1,9 +1,56 @@
package com.alibaba.druid.sql.dialect.oracle.ast.visitor;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr;
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
public class OracleParameterizedOutputVisitor extends OracleOutputVisitor {
public OracleParameterizedOutputVisitor(Appendable appender){
super(appender);
}
public SQLBinaryOpExpr merge(SQLBinaryOpExpr x) {
if (x.getRight() instanceof SQLLiteralExpr) {
x = new SQLBinaryOpExpr(x.getLeft(), x.getOperator(), new SQLVariantRefExpr("?"));
}
if (x.getLeft() instanceof SQLLiteralExpr) {
x = new SQLBinaryOpExpr(new SQLVariantRefExpr("?"), x.getOperator(), x.getRight());
}
if (x.getRight() instanceof SQLBinaryOpExpr) {
x = new SQLBinaryOpExpr(x.getLeft(), x.getOperator(), merge((SQLBinaryOpExpr) x.getRight()));
}
if (x.getLeft() instanceof SQLBinaryOpExpr) {
x = new SQLBinaryOpExpr((SQLBinaryOpExpr) x.getLeft(), x.getOperator(), x.getRight());
}
// ID = ? OR ID = ? => ID = ?
if (x.getOperator() == SQLBinaryOperator.BooleanOr) {
if ((x.getLeft() instanceof SQLBinaryOpExpr) && (x.getRight() instanceof SQLBinaryOpExpr)) {
SQLBinaryOpExpr left = (SQLBinaryOpExpr) x.getLeft();
SQLBinaryOpExpr right = (SQLBinaryOpExpr) x.getRight();
if (left.getOperator() == SQLBinaryOperator.Equality && right.getOperator() == SQLBinaryOperator.Equality) {
if ((left.getLeft() instanceof SQLIdentifierExpr) && (right.getLeft() instanceof SQLIdentifierExpr)) {
String leftColumn = left.getLeft().toString();
String rightColumn = right.getLeft().toString();
if (leftColumn.equals(rightColumn)) {
if ((left.getRight() instanceof SQLVariantRefExpr) && (right.getRight() instanceof SQLVariantRefExpr)) {
return left; // merge
}
}
}
}
}
}
return x;
}
}
@@ -641,7 +641,7 @@ public class SQLExprParser extends SQLParser {
}
public final SQLExpr equality() throws ParserException {
SQLExpr expr = multiplicative();
SQLExpr expr = additive();
return equalityRest(expr);
}
@@ -255,7 +255,7 @@ public class SQLSelectParser extends SQLParser {
join.setCondition(expr());
}
return join;
return parseTableSourceRest(join);
}
return tableSource;
@@ -389,7 +389,6 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter {
public boolean visit(SQLSelectGroupByClause x) {
if (x.getItems().size() > 0) {
println();
print("GROUP BY ");
printAndAccept(x.getItems(), ", ");
}
@@ -2,7 +2,9 @@ package com.alibaba.druid.sql;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
@@ -20,20 +22,23 @@ public class OnlineSQLTest extends TestCase {
private String password = "dragoon";
public void test_list_sql() throws Exception {
//reset();
Connection conn = DriverManager.getConnection(url, user, password);
int count = 0;
String sql = "SELECT id, value FROM m_sql_const";
String sql = "SELECT id, value FROM m_sql_const WHERE flag IS NULL LIMIT 1";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
int id = rs.getInt(1);
String value = rs.getString(2);
System.out.println(value);
System.out.println();
try {
validate(value);
validate(id, value);
} catch (Exception e) {
e.printStackTrace();
continue;
}
count++;
}
@@ -44,8 +49,43 @@ public class OnlineSQLTest extends TestCase {
conn.close();
}
void reset() throws SQLException {
Connection conn = DriverManager.getConnection(url, user, password);
void validate(String sql) throws Exception {
String sql = "UPDATE m_sql_const SET flag = NULL, value2 = NULL";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.executeUpdate();
stmt.close();
conn.close();
}
void update(int id, String value2) throws SQLException {
Connection conn = DriverManager.getConnection(url, user, password);
String sql = "UPDATE m_sql_const SET flag = 1, value2 = ? WHERE id = ?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, value2);
stmt.setInt(2, id);
stmt.executeUpdate();
stmt.close();
conn.close();
}
void validate(int id, String sql) throws Exception {
sql = sql.trim();
boolean sqlFlag = false;
String lowerSql = sql.toLowerCase();
if (lowerSql.startsWith("insert") || lowerSql.startsWith("select") || lowerSql.startsWith("upate") || lowerSql.startsWith("delete") || lowerSql.startsWith("create") || lowerSql.startsWith("drop")) {
sqlFlag = true;
}
if (!sqlFlag) {
update(id, sql);
return;
}
try {
MySqlStatementParser parser = new MySqlStatementParser(sql);
@@ -58,6 +98,7 @@ public class OnlineSQLTest extends TestCase {
MySqlParameterizedOutputVisitor visitor = new MySqlParameterizedOutputVisitor(out);
statemen.accept(visitor);
update(id, out.toString());
System.out.println(sql);
System.out.println(out.toString());
} catch (Exception e) {
@@ -112,7 +112,7 @@ public class CastFunctionsAndOperatorsTest extends TestCase {
String text = output(stmtList);
Assert.assertEquals("SELECT enum_col\nFROM tbl_name ORDER BY CAST(enum_col AS CHAR);", text);
Assert.assertEquals("SELECT enum_col\nFROM tbl_name\nORDER BY CAST(enum_col AS CHAR);", text);
}
public void test_8() throws Exception {
@@ -310,7 +310,7 @@ public class MathematicalFunctionsTest extends TestCase {
String text = output(stmtList);
Assert.assertEquals("SELECT *\nFROM tbl_name ORDER BY RAND();", text);
Assert.assertEquals("SELECT *\nFROM tbl_name\nORDER BY RAND();", text);
}
public void test_26() throws Exception {
@@ -0,0 +1,56 @@
package com.alibaba.druid.sql.mysql.bvt.parser;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.List;
import junit.framework.Assert;
import junit.framework.TestCase;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor;
import com.alibaba.druid.util.JdbcUtils;
public class MySqlParserResourceTest extends TestCase {
public void test_0() throws Exception {
exec_test("bvt/parser/mysql-0.txt");
}
public void exec_test(String resource) throws Exception {
System.out.println(resource);
InputStream is = null;
is = Thread.currentThread().getContextClassLoader().getResourceAsStream(resource);
Reader reader = new InputStreamReader(is, "UTF-8");
String input = JdbcUtils.read(reader);
JdbcUtils.close(reader);
String[] items = input.split("---------------------------");
String sql = items[0].trim();
String expect = items[1].trim();
MySqlStatementParser parser = new MySqlStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
Assert.assertEquals(1, statementList.size());
String text = output(statementList);
System.out.println(text);
Assert.assertEquals(expect, text.trim());
}
private String output(List<SQLStatement> stmtList) {
StringBuilder out = new StringBuilder();
MySqlOutputVisitor visitor = new MySqlOutputVisitor(out);
for (SQLStatement stmt : stmtList) {
stmt.accept(visitor);
}
return out.toString();
}
}
@@ -16,20 +16,20 @@ import com.alibaba.druid.util.JdbcUtils;
public class OracleSQLParserResourceTest extends TestCase {
public void test_0() throws Exception {
// exec_test("bvt/parser/oracle-0.txt");
// exec_test("bvt/parser/oracle-1.txt");
// exec_test("bvt/parser/oracle-2.txt");
// exec_test("bvt/parser/oracle-3.txt");
// exec_test("bvt/parser/oracle-4.txt");
// exec_test("bvt/parser/oracle-5.txt");
// exec_test("bvt/parser/oracle-6.txt"); // PARTITION
// exec_test("bvt/parser/oracle-7.txt");
// exec_test("bvt/parser/oracle-8.txt");
// exec_test("bvt/parser/oracle-9.txt");
// exec_test("bvt/parser/oracle-10.txt");
// exec_test("bvt/parser/oracle-11.txt");
// exec_test("bvt/parser/oracle-12.txt");
// exec_test("bvt/parser/oracle-13.txt");
exec_test("bvt/parser/oracle-0.txt");
exec_test("bvt/parser/oracle-1.txt");
exec_test("bvt/parser/oracle-2.txt");
exec_test("bvt/parser/oracle-3.txt");
exec_test("bvt/parser/oracle-4.txt");
exec_test("bvt/parser/oracle-5.txt");
exec_test("bvt/parser/oracle-6.txt"); // PARTITION
exec_test("bvt/parser/oracle-7.txt");
exec_test("bvt/parser/oracle-8.txt");
exec_test("bvt/parser/oracle-9.txt");
exec_test("bvt/parser/oracle-10.txt");
exec_test("bvt/parser/oracle-11.txt");
exec_test("bvt/parser/oracle-12.txt");
exec_test("bvt/parser/oracle-13.txt");
exec_test("bvt/parser/oracle-14.txt");
}
+12
View File
@@ -0,0 +1,12 @@
SELECT distinct a.id "id", a.col "col", a.position "position", a.panel_id "panelId"
FROM view_position_info a
LEFT JOIN view_portal b ON a.panel_id = b.panel_id
LEFT JOIN view_portal_panel c
ON a.panel_id = c.panel_id
WHERE b.user_id = ? and ((b.is_grid='y' and c.param_name='is_hidden' and c.param_value='false') or b.is_grid != 'y')
ORDER BY a.col ASC, a.position ASC
---------------------------
SELECT DISTINCT a.id AS id, a.col AS col, a.position AS position, a.panel_id AS panel_id
FROM view_position_info a LEFT JOIN view_portal b ON a.panel_id = b.panel_id LEFT JOIN view_portal_panel c ON a.panel_id = c.panel_id
WHERE b.user_id = ? AND (b.is_grid = 'y' AND c.param_name = 'is_hidden' AND c.param_value = 'false' OR b.is_grid != 'y')
ORDER BY a.col ASC, a.position ASC
+2 -2
View File
@@ -60,8 +60,8 @@ INSERT INTO GLOBAL_ACCOUNT_SMD
---------------------------
INSERT INTO GLOBAL_ACCOUNT_SMD (ID, GMT_MODIFIED, MODIFIER, GMT_CREATE, CREATOR, DOMAIN, EMPLOYEE_NUMBER, COMPANY_NAME, HOMEPAGE_URL, BACKGROUND, CATEGORY_ID, REMARK, MEMBER_ID, SALES_OWNER_ID, ACCOUNT_ID, IS_DELETED, CUST_GRADE) (SELECT ID, GMT_MODIFIED, MODIFIER, GMT_CREATE, CREATOR, DOMAIN, EMPLOYEE_NUMBER, COMPANY_NAME, HOMEPAGE_URL, BACKGROUND, CATEGORY_ID, REMARK, MEMBER_ID, SALES_OWNER_ID, ACCOUNT_ID, IS_DELETED, CUST_GRADE
FROM APOLLO_ZEUS.GLOBAL_ACCOUNT
WHERE ACCOUNT_ID = :B2 AND (DOMAIN = :B1)
WHERE ACCOUNT_ID = :B2 AND DOMAIN = :B1
UNION ALL
SELECT ID, GMT_MODIFIED, MODIFIER, GMT_CREATE, CREATOR, DOMAIN, EMPLOYEE_NUMBER, COMPANY_NAME, HOMEPAGE_URL, BACKGROUND, CATEGORY_ID, REMARK, MEMBER_ID, SALES_OWNER_ID, ACCOUNT_ID, IS_DELETED, CUST_GRADE
FROM APOLLO_NIR.GLOBAL_ACCOUNT
WHERE ACCOUNT_ID = :B2 AND (DOMAIN = :B1));
WHERE ACCOUNT_ID = :B2 AND DOMAIN = :B1);
+1 -1
View File
@@ -4,6 +4,6 @@ SELECT department_id, MIN(salary), MAX (salary)
ORDER BY department_id;
---------------------------
SELECT department_id, MIN(salary), MAX(salary)
FROM employees
FROM employees
GROUP BY department_id
ORDER BY department_id;
+1 -1
View File
@@ -9,7 +9,7 @@ SELECT DECODE(GROUPING(department_name), 1, 'All Departments',
---------------------------
SELECT DECODE(GROUPING(department_name), 1, 'All Departments', department_name) AS department_name, DECODE(GROUPING(job_id), 1, 'All Jobs', job_id) AS job_id, COUNT(*) AS COUNT, AVG(salary) * 12 AS salary
FROM employees e , departments d
WHERE d.department_id = e.department_id
WHERE d.department_id = e.department_id
GROUP BY CUBE(department_name, job_id)
ORDER BY department_name, job_id;
+1 -1
View File
@@ -15,7 +15,7 @@ SELECT channel_desc, calendar_month_desc, co.country_id,
---------------------------
SELECT channel_desc, calendar_month_desc, co.country_id, TO_CHAR(sum(amount_sold), '9,999,999,999') AS SALES$
FROM sales , customers , times , channels , countries co
WHERE sales.time_id = times.time_id AND sales.cust_id = customers.cust_id AND sales.channel_id = channels.channel_id AND customers.country_id = co.country_id AND (channels.channel_desc IN ('Direct Sales', 'Internet') AND (times.calendar_month_desc IN ('2000-09', '2000-10') AND co.country_iso_code IN ('UK', 'US')))
WHERE sales.time_id = times.time_id AND sales.cust_id = customers.cust_id AND sales.channel_id = channels.channel_id AND customers.country_id = co.country_id AND (channels.channel_desc IN ('Direct Sales', 'Internet') AND (times.calendar_month_desc IN ('2000-09', '2000-10') AND co.country_iso_code IN ('UK', 'US')))
GROUP BY GROUPING SETS ((channel_desc, calendar_month_desc, co.country_id), (channel_desc, co.country_id), (calendar_month_desc, co.country_id));
+1 -1
View File
@@ -11,7 +11,7 @@ ORDER BY a.department_id;
---------------------------
SELECT a.department_id AS department_id, a.num_emp / b.total_count AS total_count, a.sal_sum / b.total_sal AS total_sal
FROM (SELECT department_id, COUNT(*) AS num_emp, SUM(salary) AS sal_sum
FROM employees
FROM employees
GROUP BY department_id) a , (SELECT COUNT(*) AS total_count, SUM(salary) AS total_sal
FROM employees) b
ORDER BY a.department_id;