improved sql parser.

This commit is contained in:
wenshao
2017-07-23 16:44:43 +08:00
parent 82fe08109f
commit 6829a23bce
41 changed files with 1183 additions and 514 deletions
@@ -39,6 +39,6 @@ public class MySqlError_test_3 extends MysqlTest {
Assert.assertNotNull(error);
// error.printStackTrace();
Assert.assertEquals("syntax error, error in :'us = LIMIT ?, ?',expect QUES, actual QUES LIMIT", error.getMessage());
Assert.assertEquals("syntax error, error in :'us = LIMIT ?, ?',expect QUES, actual QUES pos 248, line 1, column 247, token QUES", error.getMessage());
}
}
@@ -0,0 +1,61 @@
package com.alibaba.druid.bvt.sql.mysql.param;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.parser.SQLParserUtils;
import com.alibaba.druid.sql.parser.SQLStatementParser;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
import com.alibaba.druid.util.JdbcConstants;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.serializer.SerializerFeature;
import junit.framework.TestCase;
import java.util.ArrayList;
import java.util.List;
/**
* Created by wenshao on 16/8/23.
*/
public class MySqlParameterizedOutputVisitorTest_44 extends TestCase {
public void test_for_parameterize() throws Exception {
final String dbType = JdbcConstants.MYSQL;
String sql = "select 1 from a where c1 in (date_format(date_add(curdate(), INTERVAL -7 DAY), '%Y%m%d'))";
SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType);
List<SQLStatement> stmtList = parser.parseStatementList();
SQLStatement statement = stmtList.get(0);
StringBuilder out = new StringBuilder();
SQLASTOutputVisitor visitor = SQLUtils.createOutputVisitor(out, JdbcConstants.MYSQL);
List<Object> parameters = new ArrayList<Object>();
visitor.setParameterized(true);
visitor.setParameterizedMergeInList(true);
visitor.setParameters(parameters);
/*visitor.setPrettyFormat(false);*/
statement.accept(visitor);
/* JSONArray array = new JSONArray();
for(String table : visitor.getTables()){
array.add(table.replaceAll("`",""));
}*/
String psql = out.toString();
System.out.println(psql);
assertEquals("SELECT ?\n" +
"FROM a\n" +
"WHERE c1 IN (date_format(date_add(curdate(), INTERVAL ? DAY), '%Y%m%d'))", psql);
String params_json = JSONArray.toJSONString(parameters, SerializerFeature.WriteClassName);
System.out.println(params_json);
JSONArray jsonArray = JSON.parseArray(params_json);
String json = JSONArray.toJSONString(jsonArray, SerializerFeature.WriteClassName);
assertEquals("[1,-7]", json);
String rsql = SQLUtils.toSQLString(SQLUtils.parseStatements(psql, dbType), dbType, jsonArray);
assertEquals("SELECT 1\n" +
"FROM a\n" +
"WHERE c1 IN (date_format(date_add(curdate(), INTERVAL -7 DAY), '%Y%m%d'))", rsql);
}
}
@@ -0,0 +1,86 @@
package com.alibaba.druid.bvt.sql.mysql.transform;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.statement.SQLCreateViewStatement;
import com.alibaba.druid.sql.dialect.mysql.visitor.transform.FromSubqueryResolver;
import com.alibaba.druid.util.JdbcConstants;
import junit.framework.TestCase;
import java.util.List;
/**
* Created by wenshao on 16/07/2017.
*/
public class Trans_CreateView_2 extends TestCase {
public void test_createView() throws Exception {
String sql = "CREATE OR REPLACE VIEW \"AUTH\".\"HR_DEPTEMP_VIEW\" (\n" +
"\t\"MY_PK\", \n" +
"\t\"FK_EMP\", \n" +
"\t\"FK_DEPT\", \n" +
"\t\"FK_DUTY\", \n" +
"\t\"DUTYLEVEL\", \n" +
"\t\"LEADER\", \n" +
"\t\"DEPT\", \n" +
"\t\"STORENO\", \n" +
"\t\"AREA\", \n" +
"\t\"TYPE\"\n" +
")\n" +
"AS\n" +
"WITH struct AS (\n" +
"\t\tSELECT d.code AS dept, s.code AS storeno, a.code AS area, 'S' AS type\n" +
"\t\tFROM (\n" +
"\t\t\tSELECT code, name, sjcode\n" +
"\t\t\tFROM hr_structure\n" +
"\t\t\tWHERE type = 'A'\n" +
"\t\t) a, (\n" +
"\t\t\tSELECT code, name, sjcode\n" +
"\t\t\tFROM hr_structure\n" +
"\t\t\tWHERE type = 'S'\n" +
"\t\t) s, (\n" +
"\t\t\tSELECT code, name, sjcode\n" +
"\t\t\tFROM hr_structure\n" +
"\t\t\tWHERE type = 'D'\n" +
"\t\t) d\n" +
"\t\tWHERE d.sjcode = s.code\n" +
"\t\t\tAND s.sjcode = a.code\n" +
"\t\tUNION\n" +
"\t\tSELECT d.code AS dept, NULL AS storeno, a.code AS area, 'A' AS type\n" +
"\t\tFROM (\n" +
"\t\t\tSELECT code, name, sjcode\n" +
"\t\t\tFROM hr_structure\n" +
"\t\t\tWHERE type = 'A'\n" +
"\t\t) a, (\n" +
"\t\t\tSELECT code, name, sjcode\n" +
"\t\t\tFROM hr_structure\n" +
"\t\t\tWHERE type = 'D'\n" +
"\t\t) d\n" +
"\t\tWHERE d.sjcode = a.code\n" +
"\t\tUNION\n" +
"\t\tSELECT d.code AS dept, NULL AS storeno, g.code AS area, 'G' AS type\n" +
"\t\tFROM (\n" +
"\t\t\tSELECT code, name, sjcode\n" +
"\t\t\tFROM hr_structure\n" +
"\t\t\tWHERE type = 'G'\n" +
"\t\t) g, (\n" +
"\t\t\tSELECT code, name, sjcode\n" +
"\t\t\tFROM hr_structure\n" +
"\t\t\tWHERE type = 'D'\n" +
"\t\t) d\n" +
"\t\tWHERE d.sjcode = g.code\n" +
"\t)\n" +
"SELECT \"MY_PK\", \"FK_EMP\", \"FK_DEPT\", \"FK_DUTY\", \"DUTYLEVEL\"\n" +
"\t, \"LEADER\", \"DEPT\", \"STORENO\", \"AREA\", \"TYPE\"\n" +
"FROM hr_deptemp t1, struct t2\n" +
"WHERE t1.FK_DEPT = t2.dept";
List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, JdbcConstants.ORACLE);
assertEquals(1, stmtList.size());
SQLStatement stmt = stmtList.get(0);
List<SQLStatement> targetList = FromSubqueryResolver.resolve((SQLCreateViewStatement) stmt);
String targetSql = SQLUtils.toSQLString(targetList, JdbcConstants.ORACLE);
assertEquals(9, targetList.size());
System.out.println(targetSql);
}
}
@@ -10,7 +10,7 @@ public class OdpsFormatCommentTest12 extends TestCase {
public void test_column_comment() throws Exception {
String sql = "select * from t --abc";
Assert.assertEquals("SELECT *" //
+ "\nFROM t --abc", SQLUtils.formatOdps(sql));
+ "\nFROM t -- abc", SQLUtils.formatOdps(sql));
}
@@ -22,13 +22,13 @@ public class OdpsFormatCommentTest14 extends TestCase {
Assert.assertEquals("SELECT *"
+ "\nFROM ("
+ "\n\tSELECT 1"
+ "\n\tFROM t1 --c_0"
+ "\n\tFROM t1 -- c_0"
+ "\n\tUNION ALL"
+ "\n\t--c_1"
+ "\n\t-- c_1"
+ "\n\tSELECT 2"
+ "\n\tFROM t2 --c_2"
+ "\n\tFROM t2 -- c_2"
+ "\n\tUNION ALL"
+ "\n\t--c_3"
+ "\n\t-- c_3"
+ "\n\tSELECT 3"
+ "\n\tFROM t3"
+ "\n) xx", SQLUtils.formatOdps(sql));
@@ -9,7 +9,7 @@ import junit.framework.TestCase;
public class OdpsFormatCommentTest17 extends TestCase {
public void test_column_comment() throws Exception {
String sql = "set xxx=aaa;--ssss";
Assert.assertEquals("SET xxx = aaa;--ssss", SQLUtils.formatOdps(sql));
Assert.assertEquals("SET xxx = aaa;-- ssss", SQLUtils.formatOdps(sql));
}
@@ -10,7 +10,7 @@ public class OdpsFormatCommentTest19 extends TestCase {
public void test_column_comment() throws Exception {
String sql = "set xxx=aaa;--ssss"
+ "\nset yyy=123;";
Assert.assertEquals("SET xxx = aaa;--ssss"
Assert.assertEquals("SET xxx = aaa;-- ssss"
+ "\nSET yyy = 123;", SQLUtils.formatOdps(sql));
}
@@ -14,10 +14,10 @@ public class OdpsFormatCommentTest2 extends TestCase {
+ "\n--[Update ]"//
+ "\nset odps.sql.mapper.split.size=2048;"//
+ "\nselect * from dual;";
Assert.assertEquals("--[Subject -]"
+ "\n--[Author -高铁/035139]"
+ "\n--[Created -2015-06-10 13:19:18]"
+ "\n--[Update ]"
Assert.assertEquals("-- [Subject -]"
+ "\n-- [Author -高铁/035139]"
+ "\n-- [Created -2015-06-10 13:19:18]"
+ "\n-- [Update ]"
+ "\nSET odps.sql.mapper.split.size = 2048;"
+ "\n" //
+ "\nSELECT *"
@@ -12,9 +12,9 @@ public class OdpsFormatCommentTest29 extends TestCase {
+ "\ncol string, --测试2"
+ "\ncol2 string --测试3"
+ "\n)";
Assert.assertEquals("CREATE TABLE xxxx001 ( --测试"
+ "\n\tcol STRING, --测试2"
+ "\n\tcol2 STRING --测试3"
Assert.assertEquals("CREATE TABLE xxxx001 ( -- 测试"
+ "\n\tcol STRING, -- 测试2"
+ "\n\tcol2 STRING -- 测试3"
+ "\n)", SQLUtils.formatOdps(sql));
}
}
@@ -14,7 +14,7 @@ public class OdpsFormatCommentTest30 extends TestCase {
+ "\n asdasd STRING,"
+ "\n asasd STRING"
+ "\n);";
Assert.assertEquals("--啊实打实大啊实打实大"
Assert.assertEquals("-- 啊实打实大啊实打实大"
+ "\nCREATE TABLE xxx ("
+ "\n\taa STRING,"
+ "\n\tasdasd STRING,"
@@ -12,7 +12,7 @@ public class OdpsFormatCommentTest7 extends TestCase {
+ "\nselect * from table1;" //
+ "\nselect * from table2;;"
;//
Assert.assertEquals("--这里是注释"
Assert.assertEquals("-- 这里是注释"
+ "\nSELECT *"
+ "\nFROM table1;"
+ "\n"
@@ -16,22 +16,22 @@ public class OdpsFormatCommentTest8 extends TestCase {
Assert.assertEquals("SELECT *"
+ "\nFROM table1;"
+ "\n"
+ "\n--comment1 goes here"
+ "\n-- comment1 goes here"
+ "\nSELECT *"
+ "\nFROM table2;"
+ "\n"
+ "\nSELECT *"
+ "\nFROM table3;--comment2 goes here", SQLUtils.formatOdps(sql));
+ "\nFROM table3;-- comment2 goes here", SQLUtils.formatOdps(sql));
Assert.assertEquals("select *"
+ "\nfrom table1;"
+ "\n"
+ "\n--comment1 goes here"
+ "\n-- comment1 goes here"
+ "\nselect *"
+ "\nfrom table2;"
+ "\n"
+ "\nselect *"
+ "\nfrom table3;--comment2 goes here", SQLUtils.formatOdps(sql, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION));
+ "\nfrom table3;-- comment2 goes here", SQLUtils.formatOdps(sql, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION));
}
@@ -32,13 +32,13 @@ public class OdpsSelectTest29 extends TestCase {
"--hhhhh\n" +
"FROM emp e\n" +
"LEFT OUTER JOIN emp_datahub";//
assertEquals("--aaaaa\n" +
"SELECT * --hhhhh\n" +
assertEquals("-- aaaaa\n" +
"SELECT * -- hhhhh\n" +
"FROM emp e\n" +
"LEFT OUTER JOIN emp_datahub", SQLUtils.formatOdps(sql));
assertEquals("--aaaaa\n" +
"select * --hhhhh\n" +
assertEquals("-- aaaaa\n" +
"select * -- hhhhh\n" +
"from emp e\n" +
"left outer join emp_datahub", SQLUtils.formatOdps(sql, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION));
@@ -51,7 +51,7 @@ public class OracleAlterTableTest20 extends OracleTest {
System.out.println("orderBy : " + visitor.getOrderByColumns());
Assert.assertEquals("ALTER TABLE sales" //
+ "\n\tADD CONSTRAINT sales_pk PRIMARY KEY (prod_id, cust_id) DIABLE;", //
+ "\n\tADD CONSTRAINT sales_pk PRIMARY KEY (prod_id, cust_id) DISABLE;", //
SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE));
Assert.assertEquals(1, visitor.getTables().size());
@@ -52,7 +52,7 @@ public class OracleAlterTableTest22 extends OracleTest {
System.out.println("orderBy : " + visitor.getOrderByColumns());
Assert.assertEquals("ALTER TABLE employees" //
+ "\n\tADD CONSTRAINT check_comp CHECK (salary + commission_pct * salary <= 5000) DIABLE;", //
+ "\n\tADD CONSTRAINT check_comp CHECK (salary + commission_pct * salary <= 5000) DISABLE;", //
SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE));
Assert.assertEquals(1, visitor.getTables().size());
@@ -1,131 +0,0 @@
/*
* 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.create;
import com.alibaba.druid.sql.OracleTest;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.util.JdbcConstants;
import java.util.List;
public class OracleCreateTableTest73 extends OracleTest {
public void test_types() throws Exception {
String sql = //
"CREATE TABLE \"RDB\".\"RDB_DATA_HIST\" \n" +
" (\t\"TABLE_ID\" NUMBER, \n" +
"\t\"EVENT_TYPE\" VARCHAR2(1), \n" +
"\t\"PK_DATA\" VARCHAR2(64), \n" +
"\t\"TRANSACTION_ID\" NUMBER, \n" +
"\t\"IGNORE_NODE_CLUSTER_ID\" VARCHAR2(32), \n" +
"\t\"GMT_CREATE\" DATE, \n" +
"\t\"ID\" NUMBER\n" +
" ) PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 LOGGING \n" +
" STORAGE(\n" +
" BUFFER_POOL DEFAULT)\n" +
" TABLESPACE \"BISYNC1M\" \n" +
" PARTITION BY RANGE (\"GMT_CREATE\") \n" +
" (PARTITION \"AUTO_P_2012_06_01\" VALUES LESS THAN (TO_DATE(' 2012-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) \n" +
" PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 \n" +
" STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" +
" PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)\n" +
" TABLESPACE \"BISYNC1M\" NOCOMPRESS , \n" +
" PARTITION \"AUTO_P_2012_07_01\" VALUES LESS THAN (TO_DATE(' 2012-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) \n" +
" PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 \n" +
" STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" +
" PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)\n" +
" TABLESPACE \"BISYNC1M\" NOCOMPRESS , \n" +
" PARTITION \"AUTO_P_2012_08_01\" VALUES LESS THAN (TO_DATE(' 2012-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) \n" +
" PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 \n" +
" STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" +
" PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)\n" +
" TABLESPACE \"BISYNC1M\" NOCOMPRESS , \n" +
" PARTITION \"AUTO_P_2012_09_01\" VALUES LESS THAN (TO_DATE(' 2012-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) \n" +
" PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 \n" +
" STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" +
" PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)\n" +
" TABLESPACE \"BISYNC1M\" NOCOMPRESS , \n" +
" PARTITION \"AUTO_P_2012_10_01\" VALUES LESS THAN (TO_DATE(' 2012-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) \n" +
" PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 \n" +
" STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" +
" PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)\n" +
" TABLESPACE \"BISYNC1M\" NOCOMPRESS , \n" +
" PARTITION \"AUTO_P_2012_11_01\" VALUES LESS THAN (TO_DATE(' 2012-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) \n" +
" PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 \n" +
" STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" +
" PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)\n" +
" TABLESPACE \"BISYNC1M\" NOCOMPRESS , \n" +
" PARTITION \"AUTO_P_2012_12_01\" VALUES LESS THAN (TO_DATE(' 2012-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) \n" +
" PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 \n" +
" STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" +
" PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)\n" +
" TABLESPACE \"BISYNC1M\" NOCOMPRESS , \n" +
" PARTITION \"AUTO_P_2013_01_01\" VALUES LESS THAN (TO_DATE(' 2013-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) \n" +
" PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 \n" +
" STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" +
" PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)\n" +
" TABLESPACE \"BISYNC1M\" NOCOMPRESS , \n" +
" PARTITION \"AUTO_P_2013_02_01\" VALUES LESS THAN (TO_DATE(' 2013-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) \n" +
" PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 \n" +
" STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" +
" PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)\n" +
" TABLESPACE \"BISYNC1M\" NOCOMPRESS , \n" +
" PARTITION \"AUTO_P_2013_03_01\" VALUES LESS THAN (TO_DATE(' 2013-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) \n" +
" PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 \n" +
" STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" +
" PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)\n" +
" TABLESPACE \"BISYNC1M\" NOCOM";
List<SQLStatement> statementList = SQLUtils.parseStatements(sql, JdbcConstants.ORACLE);
SQLStatement stmt = statementList.get(0);
print(statementList);
assertEquals(1, statementList.size());
//
assertEquals("CREATE GLOBAL TEMPORARY TABLE \"RETL\".\"REFFERAL_MEMBER\" (\n" +
"\t\"ID\" NUMBER NOT NULL ENABLE,\n" +
"\t\"GMT_CREATE\" DATE NOT NULL ENABLE,\n" +
"\t\"GMT_MODIFIED\" DATE NOT NULL ENABLE,\n" +
"\t\"FROM_NAME\" VARCHAR2(128) NOT NULL ENABLE,\n" +
"\t\"FROM_EMAIL\" VARCHAR2(128) NOT NULL ENABLE,\n" +
"\t\"TO_NAME\" VARCHAR2(128),\n" +
"\t\"TO_EMAIL\" VARCHAR2(128) NOT NULL ENABLE,\n" +
"\t\"MESSAGE\" VARCHAR2(512),\n" +
"\t\"GMT_JOIN_MEMBER\" DATE,\n" +
"\t\"SOURCE_CODE\" VARCHAR2(32) NOT NULL ENABLE,\n" +
"\t\"IS_FROM_MEMBER\" CHAR(1) NOT NULL ENABLE,\n" +
"\t\"IS_JOIN\" CHAR(1) NOT NULL ENABLE\n" +
")\n" +
"ON COMMIT DELETE ROWS",//
SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE));
//
// SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.ORACLE);
// 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());
//
// assertEquals(1, visitor.getTables().size());
//
// assertEquals(3, visitor.getColumns().size());
//
// assertTrue(visitor.getColumns().contains(new TableStat.Column("JWGZPT.A", "XM")));
}
}
@@ -0,0 +1,138 @@
/*
* 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.create;
import com.alibaba.druid.sql.OracleTest;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.util.JdbcConstants;
import java.util.List;
public class OracleCreateTableTest75 extends OracleTest {
public void test_types() throws Exception {
String sql = //
"CREATE TABLE \"CMIS\".\"DR$IDX_FULL_BIZ_TABLE_NAME$R\" \n" +
" (\t\"ROW_NO\" NUMBER(3,0), \n" +
"\t\"DATA\" BLOB, \n" +
"\t CONSTRAINT \"DRC$IDX_FULL_BIZ_TABLE_NAME$R\" PRIMARY KEY (\"ROW_NO\")\n" +
" USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 \n" +
" STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" +
" PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1\n" +
" BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)\n" +
" TABLESPACE \"CMISTBS\" ENABLE\n" +
" ) SEGMENT CREATION IMMEDIATE \n" +
" PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 \n" +
" NOCOMPRESS LOGGING\n" +
" STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" +
" PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1\n" +
" BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)\n" +
" TABLESPACE \"CMISTBS\" \n" +
" LOB (\"DATA\") STORE AS BASICFILE (\n" +
" TABLESPACE \"CMISTBS\" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION \n" +
" CACHE \n" +
" STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" +
" PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1\n" +
" BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)) \n" +
" MONITORING ";
List<SQLStatement> statementList = SQLUtils.parseStatements(sql, JdbcConstants.ORACLE);
SQLStatement stmt = statementList.get(0);
print(statementList);
assertEquals(1, statementList.size());
//
assertEquals("CREATE TABLE \"CMIS\".\"DR$IDX_FULL_BIZ_TABLE_NAME$R\" (\n" +
"\t\"ROW_NO\" NUMBER(3, 0),\n" +
"\t\"DATA\" BLOB,\n" +
"\tCONSTRAINT \"DRC$IDX_FULL_BIZ_TABLE_NAME$R\" PRIMARY KEY (\"ROW_NO\")\n" +
"\t\tUSING INDEX\n" +
"\t\tPCTFREE 10\n" +
"\t\tINITRANS 2\n" +
"\t\tMAXTRANS 255\n" +
"\t\tTABLESPACE \"CMISTBS\"\n" +
"\t\tSTORAGE (\n" +
"\t\t\tINITIAL 65536\n" +
"\t\t\tNEXT 1048576\n" +
"\t\t\tMINEXTENTS 1\n" +
"\t\t\tMAXEXTENTS 2147483645\n" +
"\t\t\tPCTINCREASE 0\n" +
"\t\t\tFREELISTS 1\n" +
"\t\t\tFREELIST GROUPS 1\n" +
"\t\t\tBUFFER_POOL DEFAULT\n" +
"\t\t\tFLASH_CACHE DEFAULT\n" +
"\t\t\tCELL_FLASH_CACHE DEFAULT\n" +
"\t\t)\n" +
"\t\tENABLE\n" +
")\n" +
"PCTFREE 10\n" +
"PCTUSED 40\n" +
"INITRANS 1\n" +
"MAXTRANS 255\n" +
"NOCOMPRESS\n" +
"LOGGING\n" +
"TABLESPACE \"CMISTBS\"\n" +
"STORAGE (\n" +
"\tINITIAL 65536\n" +
"\tNEXT 1048576\n" +
"\tMINEXTENTS 1\n" +
"\tMAXEXTENTS 2147483645\n" +
"\tPCTINCREASE 0\n" +
"\tFREELISTS 1\n" +
"\tFREELIST GROUPS 1\n" +
"\tBUFFER_POOL DEFAULT\n" +
"\tFLASH_CACHE DEFAULT\n" +
"\tCELL_FLASH_CACHE DEFAULT\n" +
")\n" +
"LOB (\"DATA\") STORE AS BASICFILE (\n" +
"\tTABLESPACE \"CMISTBS\"\n" +
"\tSTORAGE (\n" +
"\t\tINITIAL 65536\n" +
"\t\tNEXT 1048576\n" +
"\t\tMINEXTENTS 1\n" +
"\t\tMAXEXTENTS 2147483645\n" +
"\t\tPCTINCREASE 0\n" +
"\t\tFREELISTS 1\n" +
"\t\tFREELIST GROUPS 1\n" +
"\t\tBUFFER_POOL DEFAULT\n" +
"\t\tFLASH_CACHE DEFAULT\n" +
"\t\tCELL_FLASH_CACHE DEFAULT\n" +
"\t)\n" +
"\tENABLE STORAGE IN ROW\n" +
"\tCHUNK 8192\n" +
"\tCACHE\n" +
"\tRETENTION\n" +
")\n" +
"MONITORING",//
SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE));
//
// SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.ORACLE);
// 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());
//
// assertEquals(1, visitor.getTables().size());
//
// assertEquals(3, visitor.getColumns().size());
//
// assertTrue(visitor.getColumns().contains(new TableStat.Column("JWGZPT.A", "XM")));
}
}
@@ -46,7 +46,7 @@ public class OracleCreateViewTest8 extends OracleTest {
"\temp_id, \n" +
"\tlast_name, \n" +
"\temail UNIQUE, \n" +
"\tCONSTRAINT id_pk PRIMARY KEY (emp_id) RELY DIABLE NOVALIDATE\n" +
"\tCONSTRAINT id_pk PRIMARY KEY (emp_id) RELY DISABLE NOVALIDATE\n" +
")\n" +
"AS\n" +
"SELECT employee_id, last_name, email\n" +
@@ -0,0 +1,78 @@
/*
* 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 OracleSelectTest70 extends OracleTest {
public void test_0() throws Exception {
String sql = //
"SELECT CAST(a.nsrdzdah AS char)\n" +
"FROM DJ_NSRXX_DZB a\n" +
"\tINNER JOIN DJ_NSRXX b ON a.nsrdzdah = b.nsrdzdah\n" +
"\tINNER JOIN DM_SWJG c ON b.nsr_swjg_dm = c.swjg_dm\n" +
"WHERE (a.nsrsbh_old = ?\n" +
"\t\tOR a.nsrsbh_new = ?)\n" +
"\tAND b.nsrzt_dm <= ?\n" +
"\tAND c.JBDM LIKE ?\n" +
"\tAND rownum = 1"; //
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());
assertEquals(3, visitor.getTables().size());
assertEquals(8, visitor.getColumns().size());
{
String text = SQLUtils.toOracleString(stmt);
assertEquals("SELECT CAST(a.nsrdzdah AS char)\n" +
"FROM DJ_NSRXX_DZB a\n" +
"INNER JOIN DJ_NSRXX b ON a.nsrdzdah = b.nsrdzdah \n" +
"\tINNER JOIN DM_SWJG c ON b.nsr_swjg_dm = c.swjg_dm \n" +
"WHERE (a.nsrsbh_old = ?\n" +
"\t\tOR a.nsrsbh_new = ?)\n" +
"\tAND b.nsrzt_dm <= ?\n" +
"\tAND c.JBDM LIKE ?\n" +
"\tAND rownum = 1", 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")));
}
}