improved mysql parser.

This commit is contained in:
wenshao
2017-11-03 14:31:16 +08:00
parent 070cc5762d
commit d94b773de9
10 changed files with 509 additions and 290 deletions
@@ -25,14 +25,11 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class SQLBlockStatement extends SQLStatementImpl {
private String labelName;
private String endLabel;
private String endLabel;
private List<SQLParameter> parameters = new ArrayList<SQLParameter>();
private List<SQLStatement> statementList = new ArrayList<SQLStatement>();
public SQLStatement exception;
public SQLStatement exception;
private boolean endOfCommit;
public SQLBlockStatement() {
@@ -124,4 +121,12 @@ public class SQLBlockStatement extends SQLStatementImpl {
return null;
}
public boolean isEndOfCommit() {
return endOfCommit;
}
public void setEndOfCommit(boolean value) {
this.endOfCommit = value;
}
}
@@ -35,6 +35,10 @@ public class SQLCommitStatement extends SQLStatementImpl {
private SQLExpr transactionName;
private SQLExpr delayedDurability;
public SQLCommitStatement() {
}
public SQLCommitStatement clone() {
SQLCommitStatement x = new SQLCommitStatement();
x.write = write;
@@ -1004,7 +1004,16 @@ public class MySqlStatementParser extends SQLStatementParser {
block.setDbType(dbType);
accept(Token.BEGIN);
this.parseStatementList(block.getStatementList(), -1, block);
List<SQLStatement> statementList = block.getStatementList();
this.parseStatementList(statementList, -1, block);
if (lexer.token() != Token.END
&& statementList.size() > 0
&& (statementList.get(statementList.size() - 1) instanceof SQLCommitStatement
|| statementList.get(statementList.size() - 1) instanceof SQLRollbackStatement)) {
block.setEndOfCommit(true);
return block;
}
accept(Token.END);
return block;
@@ -2977,8 +2977,13 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
this.indentCount--;
println();
}
print0(ucase ? "BEGIN" : "begin");
this.indentCount++;
if (!x.isEndOfCommit()) {
this.indentCount++;
} else {
print(';');
}
println();
List<SQLStatement> statementList = x.getStatementList();
for (int i = 0, size = statementList.size(); i < size; ++i) {
@@ -2988,13 +2993,17 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
SQLStatement stmt = statementList.get(i);
stmt.accept(this);
}
this.indentCount--;
println();
print0(ucase ? "END" : "end");
if (labelName != null && !labelName.equals("")) {
print(' ');
print0(labelName);
if (!x.isEndOfCommit()) {
this.indentCount--;
println();
print0(ucase ? "END" : "end");
if (labelName != null && !labelName.equals("")) {
print(' ');
print0(labelName);
}
}
return false;
}
@@ -348,8 +348,13 @@ public class SQLStatementParser extends SQLParser {
if (lexer.identifierEquals("ROLLBACK")) {
SQLRollbackStatement stmt = parseRollback();
statementList.add(stmt);
if (parent instanceof SQLBlockStatement
&& JdbcConstants.MYSQL.equals(dbType)) {
return;
}
continue;
}
@@ -357,6 +362,12 @@ public class SQLStatementParser extends SQLParser {
SQLStatement stmt = parseCommit();
statementList.add(stmt);
if (parent instanceof SQLBlockStatement
&& JdbcConstants.MYSQL.equals(dbType)) {
return;
}
continue;
}
@@ -0,0 +1,93 @@
/*
* 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.mysql;
import com.alibaba.druid.sql.OracleTest;
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 java.util.List;
public class mysql_block_0 extends OracleTest {
public void test_0() throws Exception {
String sql = "BEGIN;\n" +
"DELETE t0 FROM ktv_ind_columns t0 WHERE t0.dbid=?;\n" +
" INSERT INTO ktv_ind_columns(index_owner,index_name,table_owner,TABLE_NAME,COLUMN_NAME,column_position,column_length,descend,dbId,collection_time)\n" +
" SELECT DISTINCT index_owner,index_name,table_owner,TABLE_NAME,COLUMN_NAME,column_position,column_length,descend,dbId,now()\n" +
" FROM ktv_tmp_ind_columns WHERE dbid=?;\n" +
" COMMIT;"; //
List<SQLStatement> statementList = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL);
assertEquals(1, statementList.size());
SQLStatement stmt = statementList.get(0);
SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.MYSQL);
for (SQLStatement statement : statementList) {
statement.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(2, visitor.getTables().size());
// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees")));
// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("emp_name")));
// Assert.assertEquals(7, visitor.getColumns().size());
// Assert.assertEquals(3, visitor.getConditions().size());
// Assert.assertEquals(1, visitor.getRelationships().size());
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary")));
{
String output = SQLUtils.toMySqlString(stmt);
assertEquals("BEGIN;\n" +
"DELETE t0\n" +
"FROM ktv_ind_columns t0\n" +
"WHERE t0.dbid = ?;\n" +
"INSERT INTO ktv_ind_columns (index_owner, index_name, table_owner, TABLE_NAME, COLUMN_NAME\n" +
"\t, column_position, column_length, descend, dbId, collection_time)\n" +
"SELECT DISTINCT index_owner, index_name, table_owner, TABLE_NAME, COLUMN_NAME\n" +
"\t, column_position, column_length, descend, dbId, now()\n" +
"FROM ktv_tmp_ind_columns\n" +
"WHERE dbid = ?;\n" +
"COMMIT;", //
output);
}
{
String output = SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION);
assertEquals("begin;\n" +
"delete t0\n" +
"from ktv_ind_columns t0\n" +
"where t0.dbid = ?;\n" +
"insert into ktv_ind_columns (index_owner, index_name, table_owner, TABLE_NAME, COLUMN_NAME\n" +
"\t, column_position, column_length, descend, dbId, collection_time)\n" +
"select distinct index_owner, index_name, table_owner, TABLE_NAME, COLUMN_NAME\n" +
"\t, column_position, column_length, descend, dbId, now()\n" +
"from ktv_tmp_ind_columns\n" +
"where dbid = ?;\n" +
"commit;", //
output);
}
}
}
@@ -0,0 +1,178 @@
/*
* 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.mysql;
import com.alibaba.druid.sql.OracleTest;
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 java.util.List;
public class mysql_block_1 extends OracleTest {
public void test_0() throws Exception {
String sql = "BEGIN;\n" +
" DELETE t0 FROM ktv_tmp_sqlarea t0 WHERE t0.dbid=?;\n" +
" INSERT INTO ktv_tmp_sqlarea(`dbid`,`sql_id`,`parsing_schema_name`,`sql_fulltext`,`cpu_time`,`buffer_gets`,`executions`,`command_name`,`sharable_mem`,`persiste\n" +
"nt_mem`,`users_opening`,`fetches`,`loads`,`disk_reads`,`direct_writes`,`command_type`,`plan_hash_value`,`action`,`remote`,`is_obsolete`,`physical_read_requests`,`\n" +
"physical_write_requests`,`elapsed_time`,`user_io_wait_time`,`collection_time`)\n" +
" SELECT `dbid`,`sql_id`,`parsing_schema_name`,`sql_fulltext`,sum(`cpu_time`),sum(`buffer_gets`),sum(`executions`),max(`command_name`),sum(`sharable_mem`),sum(`\n" +
"persistent_mem`),sum(`users_opening`),sum(`fetches`),sum(`loads`),sum(`disk_reads`),sum(`direct_writes`),max(`command_type`),max(`plan_hash_value`),max(`action`),\n" +
"max(`remote`),max(`is_obsolete`),sum(`physical_read_requests`),sum(`physical_write_requests`),sum(`elapsed_time`),sum(`user_io_wait_time`),max(`collection_time`)\n" +
" FROM ktv_sqlarea WHERE dbid=? GROUP BY sql_fulltext;\n" +
" DELETE FROM ktv_sqlarea WHERE dbid=?;\n" +
" INSERT INTO ktv_sqlarea(`dbid`,`sql_id`,`parsing_schema_name`,`sql_fulltext`,`cpu_time`,`buffer_gets`,`executions`,`command_name`,`sharable_mem`,`persistent_m\n" +
"em`,`users_opening`,`fetches`,`loads`,`disk_reads`,`direct_writes`,`command_type`,`plan_hash_value`,`action`,`remote`,`is_obsolete`,`physical_read_requests`,`phys\n" +
"ical_write_requests`,`elapsed_time`,`user_io_wait_time`,`collection_time`)\n" +
" SELECT `dbid`,`sql_id`,`parsing_schema_name`,`sql_fulltext`,`cpu_time`,`buffer_gets`,`executions`,`command_name`,`sharable_mem`,`persistent_mem`,`users_openin\n" +
"g`,`fetches`,`loads`,`disk_reads`,`direct_writes`,`command_type`,`plan_hash_value`,`action`,`remote`,`is_obsolete`,`physical_read_requests`,`physical_write_reques\n" +
"ts`,`elapsed_time`,`user_io_wait_time`,`collection_time`\n" +
" FROM ktv_tmp_sqlarea WHERE dbid=? and sql_fulltext is not null;\n" +
" COMMIT;\n" +
" DELETE FROM ktv_tmp_sqlarea WHERE dbid=?;"; //
List<SQLStatement> statementList = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL);
assertEquals(2, statementList.size());
SQLStatement stmt = statementList.get(0);
SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.MYSQL);
for (SQLStatement statement : statementList) {
statement.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(2, visitor.getTables().size());
// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees")));
// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("emp_name")));
// Assert.assertEquals(7, visitor.getColumns().size());
// Assert.assertEquals(3, visitor.getConditions().size());
// Assert.assertEquals(1, visitor.getRelationships().size());
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary")));
{
String output = SQLUtils.toMySqlString(stmt);
assertEquals("BEGIN;\n" +
"DELETE t0\n" +
"FROM ktv_tmp_sqlarea t0\n" +
"WHERE t0.dbid = ?;\n" +
"INSERT INTO ktv_tmp_sqlarea (`dbid`, `sql_id`, `parsing_schema_name`, `sql_fulltext`, `cpu_time`\n" +
"\t, `buffer_gets`, `executions`, `command_name`, `sharable_mem`, `persiste\n" +
"nt_mem`\n" +
"\t, `users_opening`, `fetches`, `loads`, `disk_reads`, `direct_writes`\n" +
"\t, `command_type`, `plan_hash_value`, `action`, `remote`, `is_obsolete`\n" +
"\t, `physical_read_requests`, `\n" +
"physical_write_requests`, `elapsed_time`, `user_io_wait_time`, `collection_time`)\n" +
"SELECT `dbid`, `sql_id`, `parsing_schema_name`, `sql_fulltext`\n" +
"\t, SUM(`cpu_time`), SUM(`buffer_gets`)\n" +
"\t, SUM(`executions`), MAX(`command_name`)\n" +
"\t, SUM(`sharable_mem`), SUM(`\n" +
"persistent_mem`)\n" +
"\t, SUM(`users_opening`), SUM(`fetches`)\n" +
"\t, SUM(`loads`), SUM(`disk_reads`)\n" +
"\t, SUM(`direct_writes`), MAX(`command_type`)\n" +
"\t, MAX(`plan_hash_value`), MAX(`action`)\n" +
"\t, MAX(`remote`), MAX(`is_obsolete`)\n" +
"\t, SUM(`physical_read_requests`), SUM(`physical_write_requests`)\n" +
"\t, SUM(`elapsed_time`), SUM(`user_io_wait_time`)\n" +
"\t, MAX(`collection_time`)\n" +
"FROM ktv_sqlarea\n" +
"WHERE dbid = ?\n" +
"GROUP BY sql_fulltext;\n" +
"DELETE FROM ktv_sqlarea\n" +
"WHERE dbid = ?;\n" +
"INSERT INTO ktv_sqlarea (`dbid`, `sql_id`, `parsing_schema_name`, `sql_fulltext`, `cpu_time`\n" +
"\t, `buffer_gets`, `executions`, `command_name`, `sharable_mem`, `persistent_m\n" +
"em`\n" +
"\t, `users_opening`, `fetches`, `loads`, `disk_reads`, `direct_writes`\n" +
"\t, `command_type`, `plan_hash_value`, `action`, `remote`, `is_obsolete`\n" +
"\t, `physical_read_requests`, `phys\n" +
"ical_write_requests`, `elapsed_time`, `user_io_wait_time`, `collection_time`)\n" +
"SELECT `dbid`, `sql_id`, `parsing_schema_name`, `sql_fulltext`, `cpu_time`\n" +
"\t, `buffer_gets`, `executions`, `command_name`, `sharable_mem`, `persistent_mem`\n" +
"\t, `users_openin\n" +
"g`, `fetches`, `loads`, `disk_reads`, `direct_writes`\n" +
"\t, `command_type`, `plan_hash_value`, `action`, `remote`, `is_obsolete`\n" +
"\t, `physical_read_requests`, `physical_write_reques\n" +
"ts`, `elapsed_time`, `user_io_wait_time`, `collection_time`\n" +
"FROM ktv_tmp_sqlarea\n" +
"WHERE dbid = ?\n" +
"\tAND sql_fulltext IS NOT NULL;\n" +
"COMMIT;", //
output);
}
{
String output = SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION);
assertEquals("begin;\n" +
"delete t0\n" +
"from ktv_tmp_sqlarea t0\n" +
"where t0.dbid = ?;\n" +
"insert into ktv_tmp_sqlarea (`dbid`, `sql_id`, `parsing_schema_name`, `sql_fulltext`, `cpu_time`\n" +
"\t, `buffer_gets`, `executions`, `command_name`, `sharable_mem`, `persiste\n" +
"nt_mem`\n" +
"\t, `users_opening`, `fetches`, `loads`, `disk_reads`, `direct_writes`\n" +
"\t, `command_type`, `plan_hash_value`, `action`, `remote`, `is_obsolete`\n" +
"\t, `physical_read_requests`, `\n" +
"physical_write_requests`, `elapsed_time`, `user_io_wait_time`, `collection_time`)\n" +
"select `dbid`, `sql_id`, `parsing_schema_name`, `sql_fulltext`\n" +
"\t, sum(`cpu_time`), sum(`buffer_gets`)\n" +
"\t, sum(`executions`), max(`command_name`)\n" +
"\t, sum(`sharable_mem`), sum(`\n" +
"persistent_mem`)\n" +
"\t, sum(`users_opening`), sum(`fetches`)\n" +
"\t, sum(`loads`), sum(`disk_reads`)\n" +
"\t, sum(`direct_writes`), max(`command_type`)\n" +
"\t, max(`plan_hash_value`), max(`action`)\n" +
"\t, max(`remote`), max(`is_obsolete`)\n" +
"\t, sum(`physical_read_requests`), sum(`physical_write_requests`)\n" +
"\t, sum(`elapsed_time`), sum(`user_io_wait_time`)\n" +
"\t, max(`collection_time`)\n" +
"from ktv_sqlarea\n" +
"where dbid = ?\n" +
"group by sql_fulltext;\n" +
"delete from ktv_sqlarea\n" +
"where dbid = ?;\n" +
"insert into ktv_sqlarea (`dbid`, `sql_id`, `parsing_schema_name`, `sql_fulltext`, `cpu_time`\n" +
"\t, `buffer_gets`, `executions`, `command_name`, `sharable_mem`, `persistent_m\n" +
"em`\n" +
"\t, `users_opening`, `fetches`, `loads`, `disk_reads`, `direct_writes`\n" +
"\t, `command_type`, `plan_hash_value`, `action`, `remote`, `is_obsolete`\n" +
"\t, `physical_read_requests`, `phys\n" +
"ical_write_requests`, `elapsed_time`, `user_io_wait_time`, `collection_time`)\n" +
"select `dbid`, `sql_id`, `parsing_schema_name`, `sql_fulltext`, `cpu_time`\n" +
"\t, `buffer_gets`, `executions`, `command_name`, `sharable_mem`, `persistent_mem`\n" +
"\t, `users_openin\n" +
"g`, `fetches`, `loads`, `disk_reads`, `direct_writes`\n" +
"\t, `command_type`, `plan_hash_value`, `action`, `remote`, `is_obsolete`\n" +
"\t, `physical_read_requests`, `physical_write_reques\n" +
"ts`, `elapsed_time`, `user_io_wait_time`, `collection_time`\n" +
"from ktv_tmp_sqlarea\n" +
"where dbid = ?\n" +
"\tand sql_fulltext is not null;\n" +
"commit;", //
output);
}
}
}
@@ -0,0 +1,178 @@
/*
* 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.mysql;
import com.alibaba.druid.sql.OracleTest;
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 java.util.List;
public class mysql_block_2 extends OracleTest {
public void test_0() throws Exception {
String sql = "BEGIN;\n" +
" DELETE t0 FROM ktv_tmp_sqlarea t0 WHERE t0.dbid=?;\n" +
" INSERT INTO ktv_tmp_sqlarea(`dbid`,`sql_id`,`parsing_schema_name`,`sql_fulltext`,`cpu_time`,`buffer_gets`,`executions`,`command_name`,`sharable_mem`,`persiste\n" +
"nt_mem`,`users_opening`,`fetches`,`loads`,`disk_reads`,`direct_writes`,`command_type`,`plan_hash_value`,`action`,`remote`,`is_obsolete`,`physical_read_requests`,`\n" +
"physical_write_requests`,`elapsed_time`,`user_io_wait_time`,`collection_time`)\n" +
" SELECT `dbid`,`sql_id`,`parsing_schema_name`,`sql_fulltext`,sum(`cpu_time`),sum(`buffer_gets`),sum(`executions`),max(`command_name`),sum(`sharable_mem`),sum(`\n" +
"persistent_mem`),sum(`users_opening`),sum(`fetches`),sum(`loads`),sum(`disk_reads`),sum(`direct_writes`),max(`command_type`),max(`plan_hash_value`),max(`action`),\n" +
"max(`remote`),max(`is_obsolete`),sum(`physical_read_requests`),sum(`physical_write_requests`),sum(`elapsed_time`),sum(`user_io_wait_time`),max(`collection_time`)\n" +
" FROM ktv_sqlarea WHERE dbid=? GROUP BY sql_fulltext;\n" +
" DELETE FROM ktv_sqlarea WHERE dbid=?;\n" +
" INSERT INTO ktv_sqlarea(`dbid`,`sql_id`,`parsing_schema_name`,`sql_fulltext`,`cpu_time`,`buffer_gets`,`executions`,`command_name`,`sharable_mem`,`persistent_m\n" +
"em`,`users_opening`,`fetches`,`loads`,`disk_reads`,`direct_writes`,`command_type`,`plan_hash_value`,`action`,`remote`,`is_obsolete`,`physical_read_requests`,`phys\n" +
"ical_write_requests`,`elapsed_time`,`user_io_wait_time`,`collection_time`)\n" +
" SELECT `dbid`,`sql_id`,`parsing_schema_name`,`sql_fulltext`,`cpu_time`,`buffer_gets`,`executions`,`command_name`,`sharable_mem`,`persistent_mem`,`users_openin\n" +
"g`,`fetches`,`loads`,`disk_reads`,`direct_writes`,`command_type`,`plan_hash_value`,`action`,`remote`,`is_obsolete`,`physical_read_requests`,`physical_write_reques\n" +
"ts`,`elapsed_time`,`user_io_wait_time`,`collection_time`\n" +
" FROM ktv_tmp_sqlarea WHERE dbid=? and sql_fulltext is not null;\n" +
" ROLLBACK;\n" +
" DELETE FROM ktv_tmp_sqlarea WHERE dbid=?;"; //
List<SQLStatement> statementList = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL);
assertEquals(2, statementList.size());
SQLStatement stmt = statementList.get(0);
SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.MYSQL);
for (SQLStatement statement : statementList) {
statement.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(2, visitor.getTables().size());
// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees")));
// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("emp_name")));
// Assert.assertEquals(7, visitor.getColumns().size());
// Assert.assertEquals(3, visitor.getConditions().size());
// Assert.assertEquals(1, visitor.getRelationships().size());
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary")));
{
String output = SQLUtils.toMySqlString(stmt);
assertEquals("BEGIN;\n" +
"DELETE t0\n" +
"FROM ktv_tmp_sqlarea t0\n" +
"WHERE t0.dbid = ?;\n" +
"INSERT INTO ktv_tmp_sqlarea (`dbid`, `sql_id`, `parsing_schema_name`, `sql_fulltext`, `cpu_time`\n" +
"\t, `buffer_gets`, `executions`, `command_name`, `sharable_mem`, `persiste\n" +
"nt_mem`\n" +
"\t, `users_opening`, `fetches`, `loads`, `disk_reads`, `direct_writes`\n" +
"\t, `command_type`, `plan_hash_value`, `action`, `remote`, `is_obsolete`\n" +
"\t, `physical_read_requests`, `\n" +
"physical_write_requests`, `elapsed_time`, `user_io_wait_time`, `collection_time`)\n" +
"SELECT `dbid`, `sql_id`, `parsing_schema_name`, `sql_fulltext`\n" +
"\t, SUM(`cpu_time`), SUM(`buffer_gets`)\n" +
"\t, SUM(`executions`), MAX(`command_name`)\n" +
"\t, SUM(`sharable_mem`), SUM(`\n" +
"persistent_mem`)\n" +
"\t, SUM(`users_opening`), SUM(`fetches`)\n" +
"\t, SUM(`loads`), SUM(`disk_reads`)\n" +
"\t, SUM(`direct_writes`), MAX(`command_type`)\n" +
"\t, MAX(`plan_hash_value`), MAX(`action`)\n" +
"\t, MAX(`remote`), MAX(`is_obsolete`)\n" +
"\t, SUM(`physical_read_requests`), SUM(`physical_write_requests`)\n" +
"\t, SUM(`elapsed_time`), SUM(`user_io_wait_time`)\n" +
"\t, MAX(`collection_time`)\n" +
"FROM ktv_sqlarea\n" +
"WHERE dbid = ?\n" +
"GROUP BY sql_fulltext;\n" +
"DELETE FROM ktv_sqlarea\n" +
"WHERE dbid = ?;\n" +
"INSERT INTO ktv_sqlarea (`dbid`, `sql_id`, `parsing_schema_name`, `sql_fulltext`, `cpu_time`\n" +
"\t, `buffer_gets`, `executions`, `command_name`, `sharable_mem`, `persistent_m\n" +
"em`\n" +
"\t, `users_opening`, `fetches`, `loads`, `disk_reads`, `direct_writes`\n" +
"\t, `command_type`, `plan_hash_value`, `action`, `remote`, `is_obsolete`\n" +
"\t, `physical_read_requests`, `phys\n" +
"ical_write_requests`, `elapsed_time`, `user_io_wait_time`, `collection_time`)\n" +
"SELECT `dbid`, `sql_id`, `parsing_schema_name`, `sql_fulltext`, `cpu_time`\n" +
"\t, `buffer_gets`, `executions`, `command_name`, `sharable_mem`, `persistent_mem`\n" +
"\t, `users_openin\n" +
"g`, `fetches`, `loads`, `disk_reads`, `direct_writes`\n" +
"\t, `command_type`, `plan_hash_value`, `action`, `remote`, `is_obsolete`\n" +
"\t, `physical_read_requests`, `physical_write_reques\n" +
"ts`, `elapsed_time`, `user_io_wait_time`, `collection_time`\n" +
"FROM ktv_tmp_sqlarea\n" +
"WHERE dbid = ?\n" +
"\tAND sql_fulltext IS NOT NULL;\n" +
"ROLLBACK;", //
output);
}
{
String output = SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION);
assertEquals("begin;\n" +
"delete t0\n" +
"from ktv_tmp_sqlarea t0\n" +
"where t0.dbid = ?;\n" +
"insert into ktv_tmp_sqlarea (`dbid`, `sql_id`, `parsing_schema_name`, `sql_fulltext`, `cpu_time`\n" +
"\t, `buffer_gets`, `executions`, `command_name`, `sharable_mem`, `persiste\n" +
"nt_mem`\n" +
"\t, `users_opening`, `fetches`, `loads`, `disk_reads`, `direct_writes`\n" +
"\t, `command_type`, `plan_hash_value`, `action`, `remote`, `is_obsolete`\n" +
"\t, `physical_read_requests`, `\n" +
"physical_write_requests`, `elapsed_time`, `user_io_wait_time`, `collection_time`)\n" +
"select `dbid`, `sql_id`, `parsing_schema_name`, `sql_fulltext`\n" +
"\t, sum(`cpu_time`), sum(`buffer_gets`)\n" +
"\t, sum(`executions`), max(`command_name`)\n" +
"\t, sum(`sharable_mem`), sum(`\n" +
"persistent_mem`)\n" +
"\t, sum(`users_opening`), sum(`fetches`)\n" +
"\t, sum(`loads`), sum(`disk_reads`)\n" +
"\t, sum(`direct_writes`), max(`command_type`)\n" +
"\t, max(`plan_hash_value`), max(`action`)\n" +
"\t, max(`remote`), max(`is_obsolete`)\n" +
"\t, sum(`physical_read_requests`), sum(`physical_write_requests`)\n" +
"\t, sum(`elapsed_time`), sum(`user_io_wait_time`)\n" +
"\t, max(`collection_time`)\n" +
"from ktv_sqlarea\n" +
"where dbid = ?\n" +
"group by sql_fulltext;\n" +
"delete from ktv_sqlarea\n" +
"where dbid = ?;\n" +
"insert into ktv_sqlarea (`dbid`, `sql_id`, `parsing_schema_name`, `sql_fulltext`, `cpu_time`\n" +
"\t, `buffer_gets`, `executions`, `command_name`, `sharable_mem`, `persistent_m\n" +
"em`\n" +
"\t, `users_opening`, `fetches`, `loads`, `disk_reads`, `direct_writes`\n" +
"\t, `command_type`, `plan_hash_value`, `action`, `remote`, `is_obsolete`\n" +
"\t, `physical_read_requests`, `phys\n" +
"ical_write_requests`, `elapsed_time`, `user_io_wait_time`, `collection_time`)\n" +
"select `dbid`, `sql_id`, `parsing_schema_name`, `sql_fulltext`, `cpu_time`\n" +
"\t, `buffer_gets`, `executions`, `command_name`, `sharable_mem`, `persistent_mem`\n" +
"\t, `users_openin\n" +
"g`, `fetches`, `loads`, `disk_reads`, `direct_writes`\n" +
"\t, `command_type`, `plan_hash_value`, `action`, `remote`, `is_obsolete`\n" +
"\t, `physical_read_requests`, `physical_write_reques\n" +
"ts`, `elapsed_time`, `user_io_wait_time`, `collection_time`\n" +
"from ktv_tmp_sqlarea\n" +
"where dbid = ?\n" +
"\tand sql_fulltext is not null;\n" +
"rollback;", //
output);
}
}
}
@@ -17,10 +17,12 @@ package com.alibaba.druid.bvt.sql.oracle;
import com.alibaba.druid.sql.OracleTest;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.statement.SQLMergeStatement;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource;
import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem;
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
import com.alibaba.druid.sql.parser.SQLStatementParser;
import org.junit.Assert;
@@ -74,6 +76,11 @@ public class OracleMergeTest11 extends OracleTest {
"\tAND AREA_LEVEL <= 1\n" +
"\tAND TYPE_ID = '2'", select.toString());
SQLUpdateSetItem updateSetItem = mergeStatement.getUpdateClause().getItems().get(0);
SQLExpr value = updateSetItem.getValue();
assertEquals("ROUND(B.TOTAL_CHARGE * 1.00 / 10000, 2)", value.toString());
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id")));
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary")));
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "department_id")));
@@ -1,275 +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.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.ast.statement.SQLSelectStatement;
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 OracleSelectTest102 extends OracleTest {
public void test_0() throws Exception {
String sql = //
"SELECT COUNT(:\"SYS_B_000\") AS zhx_cnt, COUNT(BILL_ID) AS BILL_ID\n" +
"\t, SUM(BILL_NUM) AS BILL_NUM, SUM(BILL_GETNUM) AS BILL_GETNUM\n" +
"\t, SUM(REMAINNUM) AS REMAINNUM, SUM(QTY_OVERLOAD) AS QTY_OVERLOAD\n" +
"FROM (\n" +
"\tSELECT P0.BILL_STATE, P0.P0670_ID, P0.BILL_IDCODE || P0.BILL_ID AS BILL_ID\n" +
"\t\t, NVL(P.PLAN_ID, :\"SYS_B_001\") AS PLAN_ID\n" +
"\t\t, NVL(P.PLAN_NAME, :\"SYS_B_002\") AS PLAN_NAME\n" +
"\t\t, :\"SYS_B_003\" || B.DEPARTMENT_USER_ID || :\"SYS_B_004\" || B.DEPARTMENT_NAME AS SET_DEPARTMENT_NAME\n" +
"\t\t, H.DICT_NAME, :\"SYS_B_005\" || C.DEPARTMENT_USER_ID || :\"SYS_B_006\" || C.DEPARTMENT_NAME AS GET_DEPARTMENT_NAME\n" +
"\t\t, C.DEPARTMENT_ID AS STYLE_DEPARTMENT_ID, P0.BILL_NUM, P0.BILL_XSUM, P0.BILL_SSUM, P0.BILL_REMARK\n" +
"\t\t, TO_CHAR(P0.BILL_SETDATE, :\"SYS_B_007\") AS BILL_SETDATE, P0.BILL_CREATE_NAME\n" +
"\t\t, TO_CHAR(P0.BILL_CREATE_DATE, :\"SYS_B_008\") AS BILL_CREATE_DATE\n" +
"\t\t, F1.BILL_IDCODE || F1.BILL_ID AS BILL_REFID\n" +
"\t\t, TO_CHAR(P0.DATE_IN, :\"SYS_B_009\") AS BILL_REMINDDATE, P0.CIRCLE AS CYCDAYS\n" +
"\t\t, DAYS AS SUBMITDAYS\n" +
"\t\t, :\"SYS_B_010\" || P0.BILL_TYPE || :\"SYS_B_011\" || NVL(F.DICT_NAME, :\"SYS_B_012\") AS BILL_SELLTYPE\n" +
"\t\t, P0.CHECKER AS BILL_SURENAME, TO_CHAR(P0.CHECK_DATE, :\"SYS_B_013\") AS BILL_SUREDATE, P0.TERMINATOR AS BILL_OVERNAME\n" +
"\t\t, TO_CHAR(P0.TERMINATE_DATE, :\"SYS_B_014\") AS BILL_OVERDATE\n" +
"\t\t, CASE \n" +
"\t\t\tWHEN P0.EXPIRE_STATUS = :\"SYS_B_015\" THEN :\"SYS_B_016\"\n" +
"\t\t\tELSE :\"SYS_B_017\"\n" +
"\t\tEND AS EXPIRE_STATUS, P0.EXPIRE_STATUS AS EXPIRE_STATUS_V, P0.STORES\n" +
"\t\t, TO_CHAR(P0.ESTIMATED_DELIVERY_DATE, :\"SYS_B_018\") AS ESTIMATED_DELIVERY_DATE, P0.BILL_GETNUM\n" +
"\t\t, SUM(CASE \n" +
"\t\t\tWHEN A1.BILLSUB_NUMS - NVL(A1.BILLSUB_GETNUMS, :\"SYS_B_019\") < :\"SYS_B_020\" THEN :\"SYS_B_021\"\n" +
"\t\t\tELSE A1.BILLSUB_NUMS - NVL(A1.BILLSUB_GETNUMS, :\"SYS_B_022\")\n" +
"\t\tEND) AS REMAINNUM\n" +
"\t\t, SUM(NVL(A1.QTY_OVERLOAD, :\"SYS_B_023\")) AS QTY_OVERLOAD\n" +
"\t\t, P0.STYLE_ID, P0.CHECKED, P0.DELED, P0.DEL, P0.DEL_DATE\n" +
"\t\t, P0.CHARGED, P0.TERMINATED, P0.BILL_NUM_GETSURE, P0.BILL_REFID AS BILL_REFID_0\n" +
"\t\t, :\"SYS_B_024\" || CODE.CODE || :\"SYS_B_025\" || CODE.NAME AS IN_TYPE_NAME\n" +
"\t\t, CASE \n" +
"\t\t\tWHEN P0.CHECKED = :\"SYS_B_026\"\n" +
"\t\t\tAND P0.TERMINATED = :\"SYS_B_027\"\n" +
"\t\t\tAND P0.DAYS > :\"SYS_B_028\"\n" +
"\t\t\tAND P0.BILL_TYPE <> :\"SYS_B_029\"\n" +
"\t\t\tAND SUM(CASE \n" +
"\t\t\t\tWHEN A1.BILLSUB_NUMS - NVL(A1.BILLSUB_GETNUMS, :\"SYS_B_030\") < :\"SYS_B_031\" THEN :\"SYS_B_032\"\n" +
"\t\t\t\tELSE A1.BILLSUB_NUMS - NVL(A1.BILLSUB_GETNUMS, :\"SYS_B_033\")\n" +
"\t\t\tEND) > :\"SYS_B_034\" THEN \n" +
"\t\t\t\tCASE \n" +
"\t\t\t\t\tWHEN P0.EXPIRE_STATUS = :\"SYS_B_035\" THEN :\"SYS_B_036\"\n" +
"\t\t\t\t\tWHEN P0.CIRCLE <> :\"SYS_B_037\"\n" +
"\t\t\t\t\tAND (P0.DATE_IN - TRUNC(SYSDATE)) / P0.CIRCLE <= :\"SYS_B_038\" THEN :\"SYS_B_039\"\n" +
"\t\t\t\t\tWHEN P0.CIRCLE <> :\"SYS_B_040\"\n" +
"\t\t\t\t\tAND (P0.DATE_IN - TRUNC(SYSDATE)) / P0.CIRCLE > :\"SYS_B_041\" THEN :\"SYS_B_042\"\n" +
"\t\t\t\t\tELSE :\"SYS_B_043\"\n" +
"\t\t\t\tEND\n" +
"\t\t\tELSE :\"SYS_B_044\"\n" +
"\t\tEND AS COLOR\n" +
"\t\t, CASE \n" +
"\t\t\tWHEN NVL(EX.ATT_CODE, :\"SYS_B_045\") = :\"SYS_B_046\" THEN :\"SYS_B_047\"\n" +
"\t\t\tELSE :\"SYS_B_048\"\n" +
"\t\tEND AS TERMINATED_CENTER\n" +
"\tFROM V0670 P0\n" +
"\tLEFT JOIN P0671 A1 ON P0.P0670_ID = A1.P0670_ID \n" +
"\tLEFT JOIN D0050 A2 ON A1.CLOTHING_ID = A2.CLOTHING_ID \n" +
"\tINNER JOIN D0060 B ON P0.SET_DEPARTMENT_ID = B.DEPARTMENT_ID \n" +
"\tLEFT JOIN V0010 H ON B.DEPARTMENT_PROPERTY = H.DICT_CODE\n" +
"\tAND H.PROPERTY_FIELD = :\"SYS_B_049\"\n" +
"\tAND H.PROPERTY_TABLE = :\"SYS_B_050\"\n" +
"\tAND H.DICT_GROUP_ID = :\"SYS_B_051\" \n" +
"\tINNER JOIN V0060 C ON P0.GET_DEPARTMENT_ID = C.DEPARTMENT_ID\n" +
"\tAND C.LANGUAGE_ID = :\"SYS_B_052\" \n" +
"\tINNER JOIN (\n" +
"\t\tSELECT /*+ MATERIALIZE */ D.DEPARTMENT_ID AS DEPARTMENT_ID\n" +
"\t\tFROM S0070 A\n" +
"\t\tINNER JOIN S0061 B ON B.DATATYPE_ID = A.DATATYPE_ID\n" +
"\t\tAND B.USER_ID = :\"SYS_B_053\"\n" +
"\t\tAND B.POWER_OPERATE = :\"SYS_B_054\" \n" +
"\t\tINNER JOIN S0071 C ON C.DATATYPE_ID = A.DATATYPE_ID \n" +
"\t\tINNER JOIN D0065 D ON C.DATA_ID = D.DEPARTMENT_ID \n" +
"\t\t\tINNER JOIN (\n" +
"\t\t\t\tSELECT TO_NUMBER(C.DATA_ID) AS BRAND_ID\n" +
"\t\t\t\tFROM S0070 A\n" +
"\t\t\t\tINNER JOIN S0061 B ON B.DATATYPE_ID = A.DATATYPE_ID\n" +
"\t\t\t\tAND B.USER_ID = :\"SYS_B_055\"\n" +
"\t\t\t\tAND B.POWER_OPERATE = :\"SYS_B_056\" \n" +
"\t\t\t\t\tINNER JOIN S0071 C ON C.DATATYPE_ID = A.DATATYPE_ID \n" +
"\t\t\t\tWHERE A.DATATYPE_PARENT_ID = :\"SYS_B_057\"\n" +
"\t\t\t\t\tAND A.DATATYPE_STATE = :\"SYS_B_058\"\n" +
"\t\t\t) E ON D.DICT_GROUP_ID = E.BRAND_ID \n" +
"\t\tWHERE A.DATATYPE_PARENT_ID = :\"SYS_B_059\"\n" +
"\t\t\tAND A.DATATYPE_STATE = :\"SYS_B_060\"\n" +
"\t\tGROUP BY D.DEPARTMENT_ID\n" +
"\t) D ON P0.GET_DEPARTMENT_ID = D.DEPARTMENT_ID \n" +
"\tINNER JOIN (\n" +
"\t\tSELECT /*+ MATERIALIZE */ TO_NUMBER(C.DATA_ID) AS DEPARTMENT_ID\n" +
"\t\tFROM S0070 A\n" +
"\t\tINNER JOIN S0061 B ON B.DATATYPE_ID = A.DATATYPE_ID\n" +
"\t\tAND B.USER_ID = :\"SYS_B_061\"\n" +
"\t\tAND B.POWER_OPERATE = :\"SYS_B_062\" \n" +
"\t\t\tINNER JOIN S0071 C ON C.DATATYPE_ID = A.DATATYPE_ID \n" +
"\t\tWHERE A.DATATYPE_PARENT_ID = :\"SYS_B_063\"\n" +
"\t\t\tAND A.DATATYPE_STATE = :\"SYS_B_064\"\n" +
"\t\tGROUP BY C.DATA_ID\n" +
"\t) E ON P0.SET_DEPARTMENT_ID = E.DEPARTMENT_ID \n" +
"\tINNER JOIN V0010 F ON F.PROPERTY_FIELD = UPPER(:\"SYS_B_065\")\n" +
"\tAND F.PROPERTY_TABLE = UPPER(:\"SYS_B_066\")\n" +
"\tAND F.LANGUAGE_ID = :\"SYS_B_067\"\n" +
"\tAND F.DICT_GROUP_ID = :\"SYS_B_068\"\n" +
"\tAND F.DICT_CODE = P0.BILL_TYPE \n" +
"\tLEFT JOIN P0670 F1 ON F1.P0670_ID = P0.BILL_CZID \n" +
"\tINNER JOIN TABLE(PKG_DRP_PUBLIC.SPLIT(:\"SYS_B_069\", :\"SYS_B_070\")) REG ON REG.COL1 = C.REGION_ID \n" +
"\tLEFT JOIN BAS_CODE CODE ON P0.IN_TYPE = CODE.CODE\n" +
"\tAND UPPER(CODE.CAT) = :\"SYS_B_071\" \n" +
"\tLEFT JOIN BILL_EXPAND EX ON P0.P0670_ID = EX.P0670_ID\n" +
"\tAND EX.BILL_TYPE = :\"SYS_B_072\"\n" +
"\tAND EX.ATT_ID = :\"SYS_B_073\" \n" +
"\t\tLEFT JOIN P0830 P ON P0.BILL_CZID = P.PLAN_ID \n" +
"\tWHERE P0.SYSTEM_TYPE = :\"SYS_B_074\"\n" +
"\t\tAND ((P0.BILL_IDCODE || P0.BILL_ID || P0.BILL_REFID || P0.BILL_CREATE_NAME || P0.BILL_NUM_SURENAME || P0.BILL_OVERNAME) LIKE (:\"SYS_B_075\" || :\"SYS_B_076\" || :\"SYS_B_077\")\n" +
"\t\t\tOR P0.BILL_CREATE_NAME LIKE (:\"SYS_B_078\" || :\"SYS_B_079\" || :\"SYS_B_080\")\n" +
"\t\t\tOR P0.CHECKER LIKE (:\"SYS_B_081\" || :\"SYS_B_082\" || :\"SYS_B_083\")\n" +
"\t\t\tOR A2.STYLE_ID LIKE (:\"SYS_B_084\" || :\"SYS_B_085\" || :\"SYS_B_086\")\n" +
"\t\t\tOR P0.BILL_CREATE_NAME IN (\n" +
"\t\t\t\tSELECT USER_NAME\n" +
"\t\t\t\tFROM WF_USER\n" +
"\t\t\t\tWHERE UPPER(USER_CODE) = :\"SYS_B_087\"\n" +
"\t\t\t))\n" +
"\t\tAND ((INSTR(:\"SYS_B_088\", :\"SYS_B_089\", :\"SYS_B_090\", :\"SYS_B_091\") = :\"SYS_B_092\"\n" +
"\t\t\t\tAND INSTR(:\"SYS_B_093\", :\"SYS_B_094\", :\"SYS_B_095\", :\"SYS_B_096\") = :\"SYS_B_097\")\n" +
"\t\t\tOR (INSTR(:\"SYS_B_098\", :\"SYS_B_099\", :\"SYS_B_100\", :\"SYS_B_101\") > :\"SYS_B_102\"\n" +
"\t\t\t\tAND NVL(P0.CHECKED, :\"SYS_B_103\") = :\"SYS_B_104\"\n" +
"\t\t\t\tAND NVL(P0.DELED, :\"SYS_B_105\") = :\"SYS_B_106\")\n" +
"\t\t\tOR (INSTR(:\"SYS_B_107\", :\"SYS_B_108\", :\"SYS_B_109\", :\"SYS_B_110\") > :\"SYS_B_111\"\n" +
"\t\t\t\tAND NVL(P0.CHECKED, :\"SYS_B_112\") = :\"SYS_B_113\"\n" +
"\t\t\t\tAND NVL(P0.DELED, :\"SYS_B_114\") = :\"SYS_B_115\"))\n" +
"\t\tAND ((INSTR(:\"SYS_B_116\", :\"SYS_B_117\", :\"SYS_B_118\", :\"SYS_B_119\") = :\"SYS_B_120\"\n" +
"\t\t\t\tAND INSTR(:\"SYS_B_121\", :\"SYS_B_122\", :\"SYS_B_123\", :\"SYS_B_124\") = :\"SYS_B_125\")\n" +
"\t\t\tOR (INSTR(:\"SYS_B_126\", :\"SYS_B_127\", :\"SYS_B_128\", :\"SYS_B_129\") > :\"SYS_B_130\"\n" +
"\t\t\t\tAND NVL(P0.TERMINATED, :\"SYS_B_131\") = :\"SYS_B_132\"\n" +
"\t\t\t\tAND NVL(P0.DELED, :\"SYS_B_133\") = :\"SYS_B_134\")\n" +
"\t\t\tOR (INSTR(:\"SYS_B_135\", :\"SYS_B_136\", :\"SYS_B_137\", :\"SYS_B_138\") > :\"SYS_B_139\"\n" +
"\t\t\t\tAND NVL(P0.TERMINATED, :\"SYS_B_140\") = :\"SYS_B_141\"\n" +
"\t\t\t\tAND NVL(P0.DELED, :\"SYS_B_142\") = :\"SYS_B_143\"))\n" +
"\t\tAND ((INSTR(:\"SYS_B_144\", :\"SYS_B_145\", :\"SYS_B_146\", :\"SYS_B_147\") = :\"SYS_B_148\"\n" +
"\t\t\t\tAND INSTR(:\"SYS_B_149\", :\"SYS_B_150\", :\"SYS_B_151\", :\"SYS_B_152\") = :\"SYS_B_153\")\n" +
"\t\t\tOR (INSTR(:\"SYS_B_154\", :\"SYS_B_155\", :\"SYS_B_156\", :\"SYS_B_157\") > :\"SYS_B_158\"\n" +
"\t\t\t\tAND NVL(P0.EXPIRE_STATUS, :\"SYS_B_159\") = :\"SYS_B_160\"\n" +
"\t\t\t\tAND NVL(P0.DELED, :\"SYS_B_161\") = :\"SYS_B_162\")\n" +
"\t\t\tOR (INSTR(:\"SYS_B_163\", :\"SYS_B_164\", :\"SYS_B_165\", :\"SYS_B_166\") > :\"SYS_B_167\"\n" +
"\t\t\t\tAND NVL(P0.EXPIRE_STATUS, :\"SYS_B_168\") = :\"SYS_B_169\"\n" +
"\t\t\t\tAND NVL(P0.DELED, :\"SYS_B_170\") = :\"SYS_B_171\"))\n" +
"\t\tAND ((INSTR(:\"SYS_B_172\", :\"SYS_B_173\", :\"SYS_B_174\", :\"SYS_B_175\") = :\"SYS_B_176\"\n" +
"\t\t\t\tAND INSTR(:\"SYS_B_177\", :\"SYS_B_178\", :\"SYS_B_179\", :\"SYS_B_180\") = :\"SYS_B_181\")\n" +
"\t\t\tOR (INSTR(:\"SYS_B_182\", :\"SYS_B_183\", :\"SYS_B_184\", :\"SYS_B_185\") > :\"SYS_B_186\"\n" +
"\t\t\t\tAND NVL(P0.DELED, :\"SYS_B_187\") = :\"SYS_B_188\")\n" +
"\t\t\tOR (INSTR(:\"SYS_B_189\", :\"SYS_B_190\", :\"SYS_B_191\", :\"SYS_B_192\") > :\"SYS_B_193\"\n" +
"\t\t\t\tAND NVL(P0.DELED, :\"SYS_B_194\") = :\"SYS_B_195\"))\n" +
"\t\tAND P0.BILL_SETDATE BETWEEN to_date(:\"SYS_B_196\", :\"SYS_B_197\") AND to_date(:\"SYS_B_198\", :\"SYS_B_199\") + :\"SYS_B_200\"\n" +
"\tGROUP BY P0.BILL_STATE, P0.P0670_ID, P0.BILL_IDCODE, P0.BILL_ID, NVL(P.PLAN_ID, :\"SYS_B_201\"), NVL(P.PLAN_NAME, :\"SYS_B_202\"), B.DEPARTMENT_USER_ID, B.DEPARTMENT_NAME, H.DICT_NAME, C.DEPARTMENT_USER_ID, C.DEPARTMENT_ID, C.DEPARTMENT_NAME, P0.BILL_NUM, P0.BILL_XSUM, P0.BILL_SSUM, P0.BILL_REMARK, P0.BILL_SETDATE, P0.BILL_CREATE_NAME, P0.BILL_CREATE_DATE, F1.BILL_IDCODE, F1.BILL_ID, P0.DATE_IN, P0.CIRCLE, DAYS, P0.BILL_TYPE, NVL(F.DICT_NAME, :\"SYS_B_203\"), P0.CHECKER, P0.CHECK_DATE, P0.TERMINATOR, P0.TERMINATE_DATE, P0.EXPIRE_STATUS, P0.EXPIRE_STATUS, P0.STORES, P0.ESTIMATED_DELIVERY_DATE, P0.BILL_GETNUM, P0.STYLE_ID, P0.CHECKED, P0.DELED, P0.DEL, P0.DEL_DATE, P0.CHARGED, P0.TERMINATED, P0.BILL_NUM_GETSURE, P0.BILL_REFID, CODE.CODE, CODE.NAME, NVL(EX.ATT_CODE, :\"SYS_B_204\")\n" +
"\tORDER BY ESTIMATED_DELIVERY_DATE ASC NULLS FIRST, P0.P0670_ID DESC";
System.out.println(sql);
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLSelectStatement stmt = (SQLSelectStatement) statementList.get(0);
System.out.println(stmt.toString());
Assert.assertEquals(1, statementList.size());
// SQLMethodInvokeExpr expr = (SQLMethodInvokeExpr) stmt.getSelect().getQueryBlock().getSelectList().get(0).getExpr();
// SQLMethodInvokeExpr param0 = (SQLMethodInvokeExpr) expr.getParameters().get(0);
// assertTrue(param0.getParameters().get(0)
// instanceof SQLAggregateExpr);
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
stmt.accept(visitor);
{
String text = SQLUtils.toOracleString(stmt);
assertEquals("SELECT e.area_name AS 区域, e.department_user_id AS 店铺代码, e.department_name AS 店铺名称, a.card_id AS 会员卡号, a.vip_name AS 姓名\n" +
"\t, CASE \n" +
"\t\tWHEN a.vip_sex = '1' THEN '男'\n" +
"\t\tWHEN a.vip_sex = '2' THEN '女'\n" +
"\t\tELSE '保密'\n" +
"\tEND AS 性别\n" +
"\t, a.vip_birthday_year || '-' || a.vip_birthday_month || '-' || a.vip_birthday_day AS 出生日期\n" +
"\t, a.vip_create_date AS 会员注册日期, a.vip_mobile AS 手机号, a.vip_job AS 职业, a.wechat AS 微信号, a.vip_email AS 邮箱\n" +
"\t, d.viptype_name AS 会员等级\n" +
"FROM D0210 a\n" +
"JOIN D0180 b ON a.vip_id = b.vip_id \n" +
"JOIN D0160 c ON c.viptype_id = b.viptype_id \n" +
"JOIN D0169 d ON d.viptype_id = c.viptype_id\n" +
"AND d.language_id = 'zh-cn' \n" +
"\tJOIN area_store_hn e ON a.department_id = e.department_id \n" +
"WHERE a.vip_create_date BETWEEN TRUNC(SYSDATE) - 4 - 10 / 24 AND TRUNC(SYSDATE) - 10 / 24 -- --注册日期\n" +
"\tAND (a.vip_state = '0'\n" +
"\t\tOR a.vip_state = '1')\n" +
"\tAND e.department_user_id IN (\n" +
"\t\t'44011', \n" +
"\t\t'44012', \n" +
"\t\t'44021', \n" +
"\t\t'44026', \n" +
"\t\t'44027', \n" +
"\t\t'44028', \n" +
"\t\t'44056', \n" +
"\t\t'44062', \n" +
"\t\t'44081', \n" +
"\t\t'44083', \n" +
"\t\t'44086', \n" +
"\t\t'44095', \n" +
"\t\t'44097', \n" +
"\t\t'44118', \n" +
"\t\t'44122', \n" +
"\t\t'44126', \n" +
"\t\t'44161', \n" +
"\t\t'44182', \n" +
"\t\t'44204', \n" +
"\t\t'44209', \n" +
"\t\t'44211', \n" +
"\t\t'44247', \n" +
"\t\t'44252', \n" +
"\t\t'44254', \n" +
"\t\t'44282', \n" +
"\t\t'44284', \n" +
"\t\t'44288', \n" +
"\t\t'44298', \n" +
"\t\t'44058', \n" +
"\t\t'44068', \n" +
"\t\t'44084', \n" +
"\t\t'44162'\n" +
"\t)\n" +
"ORDER BY a.vip_create_date", text);
}
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(5, visitor.getTables().size());
assertEquals(24, visitor.getColumns().size());
assertEquals(11, visitor.getConditions().size());
assertEquals(4, visitor.getRelationships().size());
assertEquals(1, visitor.getOrderByColumns().size());
}
}