improved oracle sql parser.

This commit is contained in:
wenshao
2017-09-21 22:21:32 +08:00
parent 7268c17624
commit 7868ec487e
@@ -0,0 +1,107 @@
/*
* 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.bvt.sql.oracle.insert;
import com.alibaba.druid.sql.OracleTest;
import com.alibaba.druid.sql.SQLUtils;
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;
import com.alibaba.druid.stat.TableStat;
import com.alibaba.druid.util.JdbcConstants;
import java.util.List;
public class OracleInsertTest22 extends OracleTest {
public void test_0() throws Exception {
String sql = "INSERT INTO MKTG_H_EXEC_RESULT_FACT\n" +
"(THE_DATE, AREA_ID, SCENE_ID, MKTG_CNT, MKTG_SUC_CNT\n" +
", TASK_CNT, TASK_F_CNT, TASK_F_SUC_CNT, CON_CNT, CON_SUC_CNT)\n" +
"SELECT TRUNC(SYSDATE), T1.AREA_ID\n" +
", RTRIM(TO_CHAR(T2.PID))\n" +
", SUM(T1.MKTG_CNT), SUM(T1.MKTG_SUC_CNT)\n" +
", SUM(T1.TASK_CNT), SUM(T1.TASK_F_CNT)\n" +
", SUM(T1.TASK_F_SUC_CNT), SUM(T1.CON_CNT)\n" +
", SUM(T1.CON_SUC_CNT)\n" +
"FROM MKTG_H_EXEC_RESULT_FACT T1, (\n" +
"SELECT DISTINCT MKTG_PLAN_LVL1_ID AS PID, MKTG_PLAN_LVL4_ID AS SCENE_ID\n" +
"FROM DMN_MKTG_PLAN_TYPE\n" +
"UNION ALL\n" +
"SELECT DISTINCT MKTG_PLAN_LVL2_ID AS PID, MKTG_PLAN_LVL4_ID AS SCENE_ID\n" +
"FROM DMN_MKTG_PLAN_TYPE_TWO\n" +
"WHERE MKTG_PLAN_LVL2_ID <> MKTG_PLAN_LVL4_ID\n" +
"UNION ALL\n" +
"SELECT DISTINCT MKTG_PLAN_LVL3_ID AS PID, MKTG_PLAN_LVL4_ID AS SCENE_ID\n" +
"FROM DMN_MKTG_PLAN_TYPE\n" +
"WHERE MKTG_PLAN_LVL3_ID <> MKTG_PLAN_LVL4_ID\n" +
") T2\n" +
"WHERE T1.THE_DATE = TRUNC(SYSDATE)\n" +
"AND T1.SCENE_ID = T2.SCENE_ID\n" +
"GROUP BY T1.AREA_ID, RTRIM(TO_CHAR(T2.PID))";
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement stmt = statementList.get(0);
print(statementList);
assertEquals(1, statementList.size());
assertEquals("INSERT INTO MKTG_H_EXEC_RESULT_FACT\n" +
"\t(THE_DATE, AREA_ID, SCENE_ID, MKTG_CNT, MKTG_SUC_CNT\n" +
"\t, TASK_CNT, TASK_F_CNT, TASK_F_SUC_CNT, CON_CNT, CON_SUC_CNT)\n" +
"SELECT TRUNC(SYSDATE), T1.AREA_ID\n" +
"\t, RTRIM(TO_CHAR(T2.PID))\n" +
"\t, SUM(T1.MKTG_CNT), SUM(T1.MKTG_SUC_CNT)\n" +
"\t, SUM(T1.TASK_CNT), SUM(T1.TASK_F_CNT)\n" +
"\t, SUM(T1.TASK_F_SUC_CNT), SUM(T1.CON_CNT)\n" +
"\t, SUM(T1.CON_SUC_CNT)\n" +
"FROM MKTG_H_EXEC_RESULT_FACT T1, (\n" +
"\tSELECT DISTINCT MKTG_PLAN_LVL1_ID AS PID, MKTG_PLAN_LVL4_ID AS SCENE_ID\n" +
"\tFROM DMN_MKTG_PLAN_TYPE\n" +
"\tUNION ALL\n" +
"\tSELECT DISTINCT MKTG_PLAN_LVL2_ID AS PID, MKTG_PLAN_LVL4_ID AS SCENE_ID\n" +
"\tFROM DMN_MKTG_PLAN_TYPE_TWO\n" +
"\tWHERE MKTG_PLAN_LVL2_ID <> MKTG_PLAN_LVL4_ID\n" +
"\tUNION ALL\n" +
"\tSELECT DISTINCT MKTG_PLAN_LVL3_ID AS PID, MKTG_PLAN_LVL4_ID AS SCENE_ID\n" +
"\tFROM DMN_MKTG_PLAN_TYPE\n" +
"\tWHERE MKTG_PLAN_LVL3_ID <> MKTG_PLAN_LVL4_ID\n" +
") T2\n" +
"WHERE T1.THE_DATE = TRUNC(SYSDATE)\n" +
"\tAND T1.SCENE_ID = T2.SCENE_ID\n" +
"GROUP BY T1.AREA_ID, RTRIM(TO_CHAR(T2.PID))",//
SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE));
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
stmt.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());
assertEquals(3, visitor.getTables().size());
assertEquals(15, visitor.getColumns().size());
assertTrue(visitor.containsTable("MKTG_H_EXEC_RESULT_FACT"));
assertTrue(visitor.containsTable("DMN_MKTG_PLAN_TYPE"));
assertTrue(visitor.containsTable("DMN_MKTG_PLAN_TYPE_TWO"));
assertTrue(visitor.getColumns().contains(new TableStat.Column("MKTG_H_EXEC_RESULT_FACT", "THE_DATE")));
}
}