improved sql parser.

This commit is contained in:
wenshao
2017-07-11 15:48:32 +08:00
parent 15ac64e501
commit bb833e499e
20 changed files with 564 additions and 95 deletions
@@ -0,0 +1,78 @@
package com.alibaba.druid.bvt;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.util.JdbcUtils;
import junit.framework.TestCase;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.MapHandler;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* Created by wenshao on 06/07/2017.
*/
public class ApacheDBUtilsTest extends TestCase {
private DruidDataSource dataSource;
protected void setUp() throws Exception {
dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://rm-bp1n325y4m6h78xt3.mysql.rds.aliyuncs.com:3306/oracle_info?allowMultiQueries=true&characterEncoding=UTF8");
dataSource.setUsername("user1");
dataSource.setPassword("ADAM2d3fb107bcda629fc");
// druid.url=jdbc:mysql://rm-bp1n325y4m6h78xt3.mysql.rds.aliyuncs.com:3306/oracle_info?allowMultiQueries=true&characterEncoding=UTF8
// druid.username=user1
// druid.password=ADAM2d3fb107bcda629fc
}
public void test_txn() throws Exception {
Connection conn = dataSource.getConnection();
Connection conn3 = dataSource.getConnection();
System.out.println("1:" + conn);
QueryRunner runner = new QueryRunner();
String sql = "select task_ida from worker limit 1";
try {
runner.query(conn, sql, new MapHandler());
//Long count = new PgCopy().pipeline(conn, sql, conn3, "worker_0607", "task_id");
} catch (Exception e) {
e.printStackTrace();
//DbUtils.closeQuietly(conn);//直接关闭close
DbUtils.rollbackAndCloseQuietly(conn);
DbUtils.commitAndCloseQuietly(conn);
}
//会抛sql.SQLException: ERROR: current transaction is aborted, commands ignored until end of transaction block Query:
try {
Connection conn1 = dataSource.getConnection();
// conn1.setAutoCommit(true);
System.out.println("2:" + conn1);
String sql1 = "select * from worker limit 1";
QueryRunner runner1 = new QueryRunner();
runner1.query(conn1, sql1, new MapHandler());
} catch (Exception e) {
e.printStackTrace();
}
//恢复正常
try {
Connection conn1 = dataSource.getConnection();
System.out.println("3:" + conn1);
String sql1 = "select * from worker limit 2";
QueryRunner runner1 = new QueryRunner();
runner1.query(conn1, sql1, new MapHandler());
} catch (Exception e) {
e.printStackTrace();
}
}
protected void tearDown() throws Exception {
JdbcUtils.close(dataSource);
}
}
@@ -0,0 +1,85 @@
/*
* 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.select;
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 org.junit.Assert;
import java.util.List;
public class OracleSelectTest67 extends OracleTest {
public void test_0() throws Exception {
String sql = //
"SELECT NVL(B.KYSLRQ, A.HZDJRQ) HZDJRQ FROM DJ_NSRXX A" +
", (SELECT B.NSRDZDAH, MIN(B.KYSLRQ) KYSLRQ FROM DJ_PZJGXX B WHERE B.NSRDZDAH = :B1 GROUP BY B.NSRDZDAH) B WHERE A.NSRDZDAH = :B1 AND A.NSRDZDAH = B.NSRDZDAH(+)"; //
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement stmt = statementList.get(0);
print(statementList);
Assert.assertEquals(1, statementList.size());
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());
System.out.println("orderBy : " + visitor.getOrderByColumns());
Assert.assertEquals(2, visitor.getTables().size());
Assert.assertEquals(4, visitor.getColumns().size());
{
String text = SQLUtils.toOracleString(stmt);
assertEquals("SELECT NVL(B.KYSLRQ, A.HZDJRQ) AS HZDJRQ\n" +
"FROM DJ_NSRXX A, (\n" +
"\tSELECT B.NSRDZDAH, MIN(B.KYSLRQ) AS KYSLRQ\n" +
"\tFROM DJ_PZJGXX B\n" +
"\tWHERE B.NSRDZDAH = :B1\n" +
"\tGROUP BY B.NSRDZDAH\n" +
") B\n" +
"WHERE A.NSRDZDAH = :B1\n" +
"\tAND A.NSRDZDAH = B.NSRDZDAH(+)", text);
}
{
String text = SQLUtils.toOracleString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION);
Assert.assertEquals("select NVL(B.KYSLRQ, A.HZDJRQ) as HZDJRQ\n" +
"from DJ_NSRXX A, (\n" +
"\tselect B.NSRDZDAH, min(B.KYSLRQ) as KYSLRQ\n" +
"\tfrom DJ_PZJGXX B\n" +
"\twhere B.NSRDZDAH = :B1\n" +
"\tgroup by B.NSRDZDAH\n" +
") B\n" +
"where A.NSRDZDAH = :B1\n" +
"\tand A.NSRDZDAH = B.NSRDZDAH(+)", text);
}
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("acduser.vw_acd_info", "xzqh")));
// Assert.assertTrue(visitor.getOrderByColumns().contains(new TableStat.Column("employees", "last_name")));
}
}
@@ -0,0 +1,162 @@
/*
* 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.select;
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 org.junit.Assert;
import java.util.List;
public class OracleSelectTest68 extends OracleTest {
public void test_0() throws Exception {
String sql = //
"INSERT INTO SB_ZZS_LDSK_2016 SELECT DJXH, :B1 , NVL(SUM(CASE WHEN ZZSLX = '2' AND LDLX = '1' THEN LDSE END), 0) SQLDSE_BQ, NVL(SUM(CASE WHEN ZZSLX = '1' AND LDLX = '1' THEN LDSE END), 0) SQLDSE_LJ, NVL(SUM(CASE WHEN LDLX = '2' THEN LDSE END), 0) SQLDSE_JZ, 0, 0, 0,SYSDATE FROM (SELECT ZZSLX, LDLX, DJXH, SUM(BCLDBHS) LDSE FROM (SELECT ZZSLX, LDLX, DJXH, SUM(T.BCLDBHS) BCLDBHS FROM HX_SB.SB_ZZS_LDSKLSZ@JSCX T WHERE T.SKSSQZ < ADD_MONTHS(:B1 ,-1)+1 AND DJXH IN (SELECT NSRDZDAH FROM DJ_NSRXX_JS_GZSB) AND T.CZLX_DM IN ('10', '66', '68', '53', '56', '61', '64') GROUP BY ZZSLX, LDLX, DJXH UNION ALL SELECT ZZSLX, LDLX, DJXH, -SUM(T.BCLDBHS) BCLDBHS FROM HX_SB.SB_ZZS_LDSKLSZ@JSCX T WHERE T.SKSSQZ = ADD_MONTHS(:B1 ,-1) AND DJXH IN (SELECT NSRDZDAH FROM DJ_NSRXX_JS_GZSB) AND T.CZLX_DM IN ('53', '56', '61', '64') GROUP BY ZZSLX, LDLX, DJXH) GROUP BY ZZSLX, LDLX, DJXH) A GROUP BY DJXH"; //
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement stmt = statementList.get(0);
print(statementList);
Assert.assertEquals(1, statementList.size());
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());
System.out.println("orderBy : " + visitor.getOrderByColumns());
Assert.assertEquals(3, visitor.getTables().size());
Assert.assertEquals(10, visitor.getColumns().size());
{
String text = SQLUtils.toOracleString(stmt);
assertEquals("INSERT INTO SB_ZZS_LDSK_2016\n" +
"SELECT DJXH, :B1\n" +
"\t, NVL(SUM(CASE \n" +
"\t\tWHEN ZZSLX = '2'\n" +
"\t\tAND LDLX = '1' THEN LDSE\n" +
"\tEND), 0) AS SQLDSE_BQ\n" +
"\t, NVL(SUM(CASE \n" +
"\t\tWHEN ZZSLX = '1'\n" +
"\t\tAND LDLX = '1' THEN LDSE\n" +
"\tEND), 0) AS SQLDSE_LJ\n" +
"\t, NVL(SUM(CASE \n" +
"\t\tWHEN LDLX = '2' THEN LDSE\n" +
"\tEND), 0) AS SQLDSE_JZ\n" +
"\t, 0, 0, 0, SYSDATE\n" +
"FROM (\n" +
"\tSELECT ZZSLX, LDLX, DJXH, SUM(BCLDBHS) AS LDSE\n" +
"\tFROM (\n" +
"\t\tSELECT ZZSLX, LDLX, DJXH, SUM(T.BCLDBHS) AS BCLDBHS\n" +
"\t\tFROM HX_SB.SB_ZZS_LDSKLSZ@JSCX T\n" +
"\t\tWHERE T.SKSSQZ < ADD_MONTHS(:B1, -1) + 1\n" +
"\t\t\tAND DJXH IN (\n" +
"\t\t\t\tSELECT NSRDZDAH\n" +
"\t\t\t\tFROM DJ_NSRXX_JS_GZSB\n" +
"\t\t\t)\n" +
"\t\t\tAND T.CZLX_DM IN (\n" +
"\t\t\t\t'10', \n" +
"\t\t\t\t'66', \n" +
"\t\t\t\t'68', \n" +
"\t\t\t\t'53', \n" +
"\t\t\t\t'56', \n" +
"\t\t\t\t'61', \n" +
"\t\t\t\t'64'\n" +
"\t\t\t)\n" +
"\t\tGROUP BY ZZSLX, LDLX, DJXH\n" +
"\t\tUNION ALL\n" +
"\t\tSELECT ZZSLX, LDLX, DJXH, -SUM(T.BCLDBHS) AS BCLDBHS\n" +
"\t\tFROM HX_SB.SB_ZZS_LDSKLSZ@JSCX T\n" +
"\t\tWHERE T.SKSSQZ = ADD_MONTHS(:B1, -1)\n" +
"\t\t\tAND DJXH IN (\n" +
"\t\t\t\tSELECT NSRDZDAH\n" +
"\t\t\t\tFROM DJ_NSRXX_JS_GZSB\n" +
"\t\t\t)\n" +
"\t\t\tAND T.CZLX_DM IN ('53', '56', '61', '64')\n" +
"\t\tGROUP BY ZZSLX, LDLX, DJXH\n" +
"\t)\n" +
"\tGROUP BY ZZSLX, LDLX, DJXH\n" +
") A\n" +
"GROUP BY DJXH", text);
}
{
String text = SQLUtils.toOracleString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION);
Assert.assertEquals("insert into SB_ZZS_LDSK_2016\n" +
"select DJXH, :B1\n" +
"\t, NVL(sum(case \n" +
"\t\twhen ZZSLX = '2'\n" +
"\t\tand LDLX = '1' then LDSE\n" +
"\tend), 0) as SQLDSE_BQ\n" +
"\t, NVL(sum(case \n" +
"\t\twhen ZZSLX = '1'\n" +
"\t\tand LDLX = '1' then LDSE\n" +
"\tend), 0) as SQLDSE_LJ\n" +
"\t, NVL(sum(case \n" +
"\t\twhen LDLX = '2' then LDSE\n" +
"\tend), 0) as SQLDSE_JZ\n" +
"\t, 0, 0, 0, sysdate\n" +
"from (\n" +
"\tselect ZZSLX, LDLX, DJXH, sum(BCLDBHS) as LDSE\n" +
"\tfrom (\n" +
"\t\tselect ZZSLX, LDLX, DJXH, sum(T.BCLDBHS) as BCLDBHS\n" +
"\t\tfrom HX_SB.SB_ZZS_LDSKLSZ@JSCX T\n" +
"\t\twhere T.SKSSQZ < ADD_MONTHS(:B1, -1) + 1\n" +
"\t\t\tand DJXH in (\n" +
"\t\t\t\tselect NSRDZDAH\n" +
"\t\t\t\tfrom DJ_NSRXX_JS_GZSB\n" +
"\t\t\t)\n" +
"\t\t\tand T.CZLX_DM in (\n" +
"\t\t\t\t'10', \n" +
"\t\t\t\t'66', \n" +
"\t\t\t\t'68', \n" +
"\t\t\t\t'53', \n" +
"\t\t\t\t'56', \n" +
"\t\t\t\t'61', \n" +
"\t\t\t\t'64'\n" +
"\t\t\t)\n" +
"\t\tgroup by ZZSLX, LDLX, DJXH\n" +
"\t\tunion all\n" +
"\t\tselect ZZSLX, LDLX, DJXH, -sum(T.BCLDBHS) as BCLDBHS\n" +
"\t\tfrom HX_SB.SB_ZZS_LDSKLSZ@JSCX T\n" +
"\t\twhere T.SKSSQZ = ADD_MONTHS(:B1, -1)\n" +
"\t\t\tand DJXH in (\n" +
"\t\t\t\tselect NSRDZDAH\n" +
"\t\t\t\tfrom DJ_NSRXX_JS_GZSB\n" +
"\t\t\t)\n" +
"\t\t\tand T.CZLX_DM in ('53', '56', '61', '64')\n" +
"\t\tgroup by ZZSLX, LDLX, DJXH\n" +
"\t)\n" +
"\tgroup by ZZSLX, LDLX, DJXH\n" +
") A\n" +
"group by DJXH", text);
}
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("acduser.vw_acd_info", "xzqh")));
// Assert.assertTrue(visitor.getOrderByColumns().contains(new TableStat.Column("employees", "last_name")));
}
}
@@ -0,0 +1,25 @@
package com.alibaba.druid.sql.calcite;
import junit.framework.TestCase;
import org.apache.calcite.plan.RelOptUtil;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.tools.FrameworkConfig;
import org.apache.calcite.tools.Frameworks;
import org.apache.calcite.tools.RelBuilder;
/**
* Created by wenshao on 03/07/2017.
*/
public class CalciteTest extends TestCase {
public void test_calcite() throws Exception {
final FrameworkConfig config = Frameworks
.newConfigBuilder()
.build();
final RelBuilder builder = RelBuilder.create(config);
final RelNode node = builder
.scan("EMP")
.build();
System.out.println(RelOptUtil.toString(node));
}
}