mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
修正输出格式
git-svn-id: http://code.alibabatech.com/svn/druid/trunk@159 b9813039-fb51-4c41-a8b9-e21c2acb5095
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+19
-1
@@ -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 ");
|
||||
|
||||
+1
-1
@@ -667,7 +667,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
}
|
||||
|
||||
if (select.getGroupBy() != null) {
|
||||
print(" ");
|
||||
println();
|
||||
select.getGroupBy().accept(this);
|
||||
}
|
||||
|
||||
|
||||
+47
@@ -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");
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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);
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
Reference in New Issue
Block a user