From 2b19baff03382d679b1dd7bd92e67911252f1128 Mon Sep 17 00:00:00 2001 From: wenshao Date: Fri, 20 May 2011 11:56:32 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E8=BE=93=E5=87=BA=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://code.alibabatech.com/svn/druid/trunk@159 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../mysql/visitor/MySqlOutputVisitor.java | 3 +- .../MySqlParameterizedOutputVisitor.java | 20 ++++++- .../ast/visitor/OracleOutputVisitor.java | 2 +- .../OracleParameterizedOutputVisitor.java | 47 ++++++++++++++++ .../druid/sql/parser/SQLExprParser.java | 2 +- .../druid/sql/parser/SQLSelectParser.java | 2 +- .../sql/visitor/SQLASTOutputVisitor.java | 1 - .../com/alibaba/druid/sql/OnlineSQLTest.java | 47 +++++++++++++++- .../bvt/CastFunctionsAndOperatorsTest.java | 2 +- .../mysql/bvt/MathematicalFunctionsTest.java | 2 +- .../bvt/parser/MySqlParserResourceTest.java | 56 +++++++++++++++++++ .../bvt/OracleSQLParserResourceTest.java | 28 +++++----- src/test/resources/bvt/parser/mysql-0.txt | 12 ++++ src/test/resources/bvt/parser/oracle-1.txt | 4 +- src/test/resources/bvt/parser/oracle-12.txt | 2 +- src/test/resources/bvt/parser/oracle-13.txt | 2 +- src/test/resources/bvt/parser/oracle-14.txt | 2 +- src/test/resources/bvt/parser/oracle-5.txt | 2 +- 18 files changed, 205 insertions(+), 31 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/sql/mysql/bvt/parser/MySqlParserResourceTest.java create mode 100644 src/test/resources/bvt/parser/mysql-0.txt 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 7709e7382a..511f5c6ca9 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 @@ -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); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlParameterizedOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlParameterizedOutputVisitor.java index d005a89f64..9ab05add99 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlParameterizedOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlParameterizedOutputVisitor.java @@ -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 "); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleOutputVisitor.java index 3640c3b596..9997b495c3 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleOutputVisitor.java @@ -667,7 +667,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } if (select.getGroupBy() != null) { - print(" "); + println(); select.getGroupBy().accept(this); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleParameterizedOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleParameterizedOutputVisitor.java index d76136839b..fad5df2778 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleParameterizedOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/visitor/OracleParameterizedOutputVisitor.java @@ -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; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index 17ecd20811..d3fc607221 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -641,7 +641,7 @@ public class SQLExprParser extends SQLParser { } public final SQLExpr equality() throws ParserException { - SQLExpr expr = multiplicative(); + SQLExpr expr = additive(); return equalityRest(expr); } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java index 928a3fddc1..121b445636 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java @@ -255,7 +255,7 @@ public class SQLSelectParser extends SQLParser { join.setCondition(expr()); } - return join; + return parseTableSourceRest(join); } return tableSource; diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 4c2cd5f3f0..f519dd74fe 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -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(), ", "); } diff --git a/src/test/java/com/alibaba/druid/sql/OnlineSQLTest.java b/src/test/java/com/alibaba/druid/sql/OnlineSQLTest.java index 27499c6121..76729b30e7 100644 --- a/src/test/java/com/alibaba/druid/sql/OnlineSQLTest.java +++ b/src/test/java/com/alibaba/druid/sql/OnlineSQLTest.java @@ -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) { diff --git a/src/test/java/com/alibaba/druid/sql/mysql/bvt/CastFunctionsAndOperatorsTest.java b/src/test/java/com/alibaba/druid/sql/mysql/bvt/CastFunctionsAndOperatorsTest.java index 63d8bc591c..d8bc3db77a 100644 --- a/src/test/java/com/alibaba/druid/sql/mysql/bvt/CastFunctionsAndOperatorsTest.java +++ b/src/test/java/com/alibaba/druid/sql/mysql/bvt/CastFunctionsAndOperatorsTest.java @@ -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 { diff --git a/src/test/java/com/alibaba/druid/sql/mysql/bvt/MathematicalFunctionsTest.java b/src/test/java/com/alibaba/druid/sql/mysql/bvt/MathematicalFunctionsTest.java index 5d297a7827..5040fd9163 100644 --- a/src/test/java/com/alibaba/druid/sql/mysql/bvt/MathematicalFunctionsTest.java +++ b/src/test/java/com/alibaba/druid/sql/mysql/bvt/MathematicalFunctionsTest.java @@ -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 { diff --git a/src/test/java/com/alibaba/druid/sql/mysql/bvt/parser/MySqlParserResourceTest.java b/src/test/java/com/alibaba/druid/sql/mysql/bvt/parser/MySqlParserResourceTest.java new file mode 100644 index 0000000000..989c116669 --- /dev/null +++ b/src/test/java/com/alibaba/druid/sql/mysql/bvt/parser/MySqlParserResourceTest.java @@ -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 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 stmtList) { + StringBuilder out = new StringBuilder(); + MySqlOutputVisitor visitor = new MySqlOutputVisitor(out); + + for (SQLStatement stmt : stmtList) { + stmt.accept(visitor); + } + + return out.toString(); + } +} diff --git a/src/test/java/com/alibaba/druid/sql/oracle/bvt/OracleSQLParserResourceTest.java b/src/test/java/com/alibaba/druid/sql/oracle/bvt/OracleSQLParserResourceTest.java index ab92de70bf..0d7fbc125d 100644 --- a/src/test/java/com/alibaba/druid/sql/oracle/bvt/OracleSQLParserResourceTest.java +++ b/src/test/java/com/alibaba/druid/sql/oracle/bvt/OracleSQLParserResourceTest.java @@ -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"); } diff --git a/src/test/resources/bvt/parser/mysql-0.txt b/src/test/resources/bvt/parser/mysql-0.txt new file mode 100644 index 0000000000..ac604f220a --- /dev/null +++ b/src/test/resources/bvt/parser/mysql-0.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 \ No newline at end of file diff --git a/src/test/resources/bvt/parser/oracle-1.txt b/src/test/resources/bvt/parser/oracle-1.txt index e847117269..1c34682e6a 100644 --- a/src/test/resources/bvt/parser/oracle-1.txt +++ b/src/test/resources/bvt/parser/oracle-1.txt @@ -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)); \ No newline at end of file + WHERE ACCOUNT_ID = :B2 AND DOMAIN = :B1); \ No newline at end of file diff --git a/src/test/resources/bvt/parser/oracle-12.txt b/src/test/resources/bvt/parser/oracle-12.txt index 2d4c93aea2..53c53838b6 100644 --- a/src/test/resources/bvt/parser/oracle-12.txt +++ b/src/test/resources/bvt/parser/oracle-12.txt @@ -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; \ No newline at end of file diff --git a/src/test/resources/bvt/parser/oracle-13.txt b/src/test/resources/bvt/parser/oracle-13.txt index a121104253..a9f43ca08b 100644 --- a/src/test/resources/bvt/parser/oracle-13.txt +++ b/src/test/resources/bvt/parser/oracle-13.txt @@ -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; diff --git a/src/test/resources/bvt/parser/oracle-14.txt b/src/test/resources/bvt/parser/oracle-14.txt index 5efa2904aa..6b264105a4 100644 --- a/src/test/resources/bvt/parser/oracle-14.txt +++ b/src/test/resources/bvt/parser/oracle-14.txt @@ -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)); diff --git a/src/test/resources/bvt/parser/oracle-5.txt b/src/test/resources/bvt/parser/oracle-5.txt index 7db447f92e..0d1ea0fafb 100644 --- a/src/test/resources/bvt/parser/oracle-5.txt +++ b/src/test/resources/bvt/parser/oracle-5.txt @@ -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; \ No newline at end of file