improved sql parser.

This commit is contained in:
wenshao
2017-08-08 20:34:21 +08:00
parent bcb692f424
commit 5ea4ac8009
35 changed files with 538 additions and 22 deletions
@@ -459,7 +459,7 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest {
")", repository.console("show create table test5"));
repository.console("CREATE TABLE sc01.test6 as select a.id, c_tinyint, 'a' f3, 3 f4 from test2 a");
assertEquals("CREATE TABLE test6 (\n" +
assertEquals("CREATE TABLE sc01.test6 (\n" +
"\tid bigint(20),\n" +
"\tc_tinyint tinyint(4),\n" +
"\tf3 varchar,\n" +
@@ -939,5 +939,34 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest {
, repository.console("show create table test1_xx"));
assertEquals("CREATE TABLE test5 (\n" +
"\tc_decimal_1 INT(11),\n" +
"\tid bigint(20),\n" +
"\tc_tinyint tinyint(4),\n" +
"\tc_smallint smallint(6),\n" +
"\tc_mediumint mediumint(9),\n" +
"\tc_int int(11),\n" +
"\tc_bigint bigint(20),\n" +
"\tc_date date,\n" +
"\tc_datetime datetime,\n" +
"\tc_timestamp timestamp,\n" +
"\tc_time time,\n" +
"\tc_char char(10),\n" +
"\tc_varchar varchar(10),\n" +
"\tc_blob blob,\n" +
"\tc_text text,\n" +
"\tc_mediumtext mediumtext,\n" +
"\tc_longblob longblob\n" +
")"
, repository.console("show create table test5"));
repository.console("create table test5(fid bigint)");
assertEquals("CREATE TABLE test5 (\n" +
"\tfid bigint\n" +
")"
, repository.console("show create table test5"));
}
}
@@ -0,0 +1,75 @@
/*
* 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.odps;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.visitor.SchemaStatVisitor;
import com.alibaba.druid.util.JdbcConstants;
import junit.framework.TestCase;
import java.util.List;
public class OdpsSelectTest34 extends TestCase {
public void test_select() throws Exception {
// 1095288847322
String sql = "select a.city, a.car_id, a.rrc_id, a.brand, a.car_series, a.title\n" +
"from dw_x001_cp_used_car_detail a\n" +
"where status = 'PUBLISHED'\n" +
"and model_id = 4419\n" +
"and abs(datediff(licensed_date, '2013-07-01 00:00:00', 'mm')) <= 5\n" +
"and abs(mileage - 7.01) < 3;";//
assertEquals("SELECT a.city, a.car_id, a.rrc_id, a.brand, a.car_series\n" +
"\t, a.title\n" +
"FROM dw_x001_cp_used_car_detail a\n" +
"WHERE status = 'PUBLISHED'\n" +
"\tAND model_id = 4419\n" +
"\tAND abs(datediff(licensed_date, '2013-07-01 00:00:00', 'mm')) <= 5\n" +
"\tAND abs(mileage - 7.01) < 3;", SQLUtils.formatOdps(sql));
assertEquals("select a.city, a.car_id, a.rrc_id, a.brand, a.car_series\n" +
"\t, a.title\n" +
"from dw_x001_cp_used_car_detail a\n" +
"where status = 'PUBLISHED'\n" +
"\tand model_id = 4419\n" +
"\tand abs(datediff(licensed_date, '2013-07-01 00:00:00', 'mm')) <= 5\n" +
"\tand abs(mileage - 7.01) < 3;", SQLUtils.formatOdps(sql, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION));
List<SQLStatement> statementList = SQLUtils.parseStatements(sql, JdbcConstants.ODPS);
SQLStatement stmt = statementList.get(0);
assertEquals(1, statementList.size());
SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.ODPS);
stmt.accept(visitor);
System.out.println("Tables : " + visitor.getTables());
System.out.println("fields : " + visitor.getColumns());
// System.out.println("coditions : " + visitor.getConditions());
// System.out.println("orderBy : " + visitor.getOrderByColumns());
assertEquals(1, visitor.getTables().size());
assertEquals(10, visitor.getColumns().size());
assertEquals(2, visitor.getConditions().size());
// System.out.println(SQLUtils.formatOdps(sql));
// assertTrue(visitor.getColumns().contains(new Column("abc", "name")));
}
}
@@ -0,0 +1,73 @@
/*
* 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.odps;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.visitor.SchemaStatVisitor;
import com.alibaba.druid.util.JdbcConstants;
import junit.framework.TestCase;
import java.util.List;
public class OdpsSelectTest35 extends TestCase {
public void test_select() throws Exception {
// 1095288847322
String sql = "SELECT a.city, a.car_id, a.rrc_id, a.brand, a.car_series\n" +
" , a.title\n" +
"FROM dw_x001_cp_used_car_detail a\n" +
"WHERE status = 'PUBLISHED'\n" +
" AND model_id = 4419\n" +
" AND abs(datediff(licensed_date, '2013-07-01 00:00:00', 'mm')) <= 5;";//
assertEquals("SELECT a.city, a.car_id, a.rrc_id, a.brand, a.car_series\n" +
"\t, a.title\n" +
"FROM dw_x001_cp_used_car_detail a\n" +
"WHERE status = 'PUBLISHED'\n" +
"\tAND model_id = 4419\n" +
"\tAND abs(datediff(licensed_date, '2013-07-01 00:00:00', 'mm')) <= 5;", SQLUtils.formatOdps(sql));
assertEquals("select a.city, a.car_id, a.rrc_id, a.brand, a.car_series\n" +
"\t, a.title\n" +
"from dw_x001_cp_used_car_detail a\n" +
"where status = 'PUBLISHED'\n" +
"\tand model_id = 4419\n" +
"\tand abs(datediff(licensed_date, '2013-07-01 00:00:00', 'mm')) <= 5;", SQLUtils.formatOdps(sql, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION));
List<SQLStatement> statementList = SQLUtils.parseStatements(sql, JdbcConstants.ODPS);
SQLStatement stmt = statementList.get(0);
assertEquals(1, statementList.size());
SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.ODPS);
stmt.accept(visitor);
System.out.println("Tables : " + visitor.getTables());
System.out.println("fields : " + visitor.getColumns());
// System.out.println("coditions : " + visitor.getConditions());
// System.out.println("orderBy : " + visitor.getOrderByColumns());
assertEquals(1, visitor.getTables().size());
assertEquals(9, visitor.getColumns().size());
assertEquals(2, visitor.getConditions().size());
// System.out.println(SQLUtils.formatOdps(sql));
// assertTrue(visitor.getColumns().contains(new Column("abc", "name")));
}
}
@@ -0,0 +1,26 @@
package com.alibaba.druid.mysql;
import com.alibaba.druid.DbTestCase;
import com.alibaba.druid.util.JdbcConstants;
import com.alibaba.druid.util.JdbcUtils;
import java.sql.Connection;
/**
* Created by wenshao on 23/07/2017.
*/
public class MySql_Failover_test extends DbTestCase {
public MySql_Failover_test() {
super("pool_config/mysql_db_failover.properties");
}
public void test_oracle() throws Exception {
Connection conn = getConnection();
String createTableScript = JdbcUtils.getCreateTableScript(conn, JdbcConstants.MYSQL);
System.out.println(createTableScript);
conn.close();
}
}