improve sql parser, sql server support with

This commit is contained in:
wenshao
2013-01-07 07:46:41 +08:00
parent c7b30480c1
commit 9ad2d6ad13
6 changed files with 284 additions and 2 deletions
@@ -0,0 +1,62 @@
/*
* Copyright 1999-2011 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.sqlserver;
import junit.framework.TestCase;
import org.junit.Assert;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerStatementParser;
import com.alibaba.druid.sql.test.TestUtils;
public class SQLServerSelectTest6 extends TestCase {
public void test_isEmpty() throws Exception {
String sql = "WITH DirReps(ManagerID, DirectReports) AS " + //
"(" + //
" SELECT ManagerID, COUNT(*) " + //
" FROM HumanResources.Employee AS e" + //
" WHERE ManagerID IS NOT NULL" + //
" GROUP BY ManagerID" + //
")" + //
"SELECT ManagerID, DirectReports " + //
"FROM DirReps " + //
"ORDER BY ManagerID;";
String expect = "WITH" +
"\n\tDirReps (ManagerID, DirectReports)" +
"\n\tAS" +
"\n\t(" +
"\n\t\tSELECT ManagerID, COUNT(*)" +
"\n\t\tFROM HumanResources.Employee e" +
"\n\t\tWHERE ManagerID IS NOT NULL" +
"\n\t\tGROUP BY ManagerID" +
"\n\t)" +
"\nSELECT ManagerID, DirectReports" +
"\nFROM DirReps" +
"\nORDER BY ManagerID";
SQLServerStatementParser parser = new SQLServerStatementParser(sql);
SQLStatement stmt = parser.parseStatementList().get(0);
String text = TestUtils.outputSqlServer(stmt);
Assert.assertEquals(expect, text);
System.out.println(text);
}
}
@@ -0,0 +1,109 @@
/*
* Copyright 1999-2011 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.sqlserver;
import junit.framework.TestCase;
import org.junit.Assert;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerStatementParser;
import com.alibaba.druid.sql.test.TestUtils;
public class SQLServerSelectTest7 extends TestCase {
public void test_isEmpty() throws Exception {
String sql = "with menu_view as(" +
"\n select t.*,1 level from sec_portal_menu t where t.parent_id = ?" +
"\n union all" +
"\n select t.*,level + 1 from sec_portal_menu t , menu_view x where t.parent_id = x.menu_id" +
"\n )" +
"\n select t.menu_id \"id\"," +
"\n t.menu_name \"name\"," +
"\n t.parent_id \"pId\"," +
"\n case t.level when 1 then 'true' else 'false' end \"open\"," +
"\n t.link_type \"linkType\"" +
"\n from menu_view t" +
"\n where 1=1" +
"\n and t.deleted = 0" +
"\n --菜单权限控制" +
"\n AND t.link_type in ('simple','link')" +
"\n AND (" +
"\n EXISTS (" +
"\n select p.entity_code from sec_role_auth p where p.entity_code = t.menu_id" +
"\n and p.entity_type = 'menu'" +
"\n and p.role_id in (" +
"\n select r.role_code from sec_role_member rm ,sec_role r where rm.entity_type = 'user'" +
"\n and entity_code = ? --用户ID" +
"\n and r.role_id = rm.role_id" +
"\n and r.enabled = 1" +
"\n and r.deleted = 0" +
"\n )" +
"\n )" +
"\n or '1'= ? --超级管理员账户id" +
"\n or t.need_control = 0" +
"\n )" +
"\n AND (" +
"\n t.enabled = 1 or '1'= ? --超级管理员账户id" +
"\n or t.need_control = 0" +
"\n )" +
"\n order by t.sort_order";
String expect = "WITH" +
"\n\tmenu_view" +
"\n\tAS" +
"\n\t(" +
"\n\t\tSELECT t.*, 1 AS level" +
"\n\t\tFROM sec_portal_menu t" +
"\n\t\tWHERE t.parent_id = ?" +
"\n\t\tUNION ALL" +
"\n\t\tSELECT t.*, level + 1" +
"\n\t\tFROM sec_portal_menu t, menu_view x" +
"\n\t\tWHERE t.parent_id = x.menu_id" +
"\n\t)" +
"\nSELECT t.menu_id AS \"id\", t.menu_name AS \"name\", t.parent_id AS \"pId\", CASE t.level WHEN 1 THEN 'true' ELSE 'false' END AS \"open\", t.link_type AS \"linkType\"" +
"\nFROM menu_view t" +
"\nWHERE 1 = 1" +
"\n\tAND t.deleted = 0" +
"\n\tAND t.link_type IN ('simple', 'link')" +
"\n\tAND (EXISTS (SELECT p.entity_code" +
"\n\t\t\tFROM sec_role_auth p" +
"\n\t\t\tWHERE p.entity_code = t.menu_id" +
"\n\t\t\t\tAND p.entity_type = 'menu'" +
"\n\t\t\t\tAND p.role_id IN (SELECT r.role_code" +
"\n\t\t\t\t\tFROM sec_role_member rm, sec_role r" +
"\n\t\t\t\t\tWHERE rm.entity_type = 'user'" +
"\n\t\t\t\t\t\tAND entity_code = ?" +
"\n\t\t\t\t\t\tAND r.role_id = rm.role_id" +
"\n\t\t\t\t\t\tAND r.enabled = 1" +
"\n\t\t\t\t\t\tAND r.deleted = 0))" +
"\n\t\tOR '1' = ?" +
"\n\t\tOR t.need_control = 0)" +
"\n\tAND (t.enabled = 1" +
"\n\t\tOR '1' = ?" +
"\n\t\tOR t.need_control = 0)" +
"\nORDER BY t.sort_order";
SQLServerStatementParser parser = new SQLServerStatementParser(sql);
SQLStatement stmt = parser.parseStatementList().get(0);
String text = TestUtils.outputSqlServer(stmt);
Assert.assertEquals(expect, text);
System.out.println(text);
}
}