mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improved sql parser.
This commit is contained in:
@@ -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));
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user