Skip to content

Commit

Permalink
优化支持union后的括号逻辑
Browse files Browse the repository at this point in the history
优化支持union后的括号逻辑
  • Loading branch information
lizongbo committed May 8, 2024
1 parent 3e9796e commit c985edb
Show file tree
Hide file tree
Showing 13 changed files with 53 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -165,4 +165,25 @@ public SQLColumnDefinition findColumn(long columnNameHash) {
}
return null;
}

public SQLColumnDefinition findColumn(String columnName) {
SQLSelectQueryBlock queryBlock = select.getFirstQueryBlock();
if (queryBlock != null) {
return queryBlock.findColumn(columnName);
} else {
if (select.getQuery() instanceof SQLUnionQuery && ((SQLUnionQuery) select.getQuery()).getFirstQueryBlock() instanceof SQLSelectQueryBlock) {
SQLSelectQueryBlock left = ((SQLUnionQuery) select.getQuery()).getFirstQueryBlock();
return ((SQLSelectQueryBlock) left).findColumn(columnName);
}
}
return null;
}

public static SQLSubqueryTableSource fixParenthesized(SQLSubqueryTableSource rightTableSourceTmp) {
if (rightTableSourceTmp.getSelect() != null && rightTableSourceTmp.getSelect().getQuery() != null && rightTableSourceTmp.getSelect()
.getQuery().isParenthesized()) {
rightTableSourceTmp.getSelect().getQuery().setParenthesized(false);
}
return rightTableSourceTmp;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -389,7 +389,7 @@ public SQLTableSource parseTableSource(SQLObject parent) {
select.getQuery().setParenthesized(true);
tableSource = new SQLUnionQueryTableSource((SQLUnionQuery) query);
} else {
tableSource = new SQLSubqueryTableSource(select);
tableSource = SQLSubqueryTableSource.fixParenthesized(new SQLSubqueryTableSource(select));
}

if (hints != null) {
Expand All @@ -407,7 +407,7 @@ public SQLTableSource parseTableSource(SQLObject parent) {
select.getQuery().setParenthesized(true);
tableSource = new SQLUnionQueryTableSource((SQLUnionQuery) query);
} else {
tableSource = new SQLSubqueryTableSource(select);
tableSource = SQLSubqueryTableSource.fixParenthesized(new SQLSubqueryTableSource(select));
}

if (hints != null) {
Expand All @@ -422,7 +422,7 @@ public SQLTableSource parseTableSource(SQLObject parent) {
unionQuery.setParenthesized(true);
tableSource = new SQLUnionQueryTableSource((SQLUnionQuery) query);
} else {
tableSource = new SQLSubqueryTableSource(unionQuery);
tableSource = SQLSubqueryTableSource.fixParenthesized(new SQLSubqueryTableSource(unionQuery));
}

if (hints != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -421,6 +421,7 @@ public SQLExpr primary() {

accept(Token.RPAREN);


break;
case INSERT:
lexer.nextToken();
Expand Down Expand Up @@ -4100,6 +4101,7 @@ public SQLExpr notRationalRest(SQLExpr expr, boolean global) {
if (targetList.size() == 1
&& targetList.get(0) instanceof SQLQueryExpr) {
SQLQueryExpr queryExpr = (SQLQueryExpr) targetList.get(0);
queryExpr.getSubQuery().getQuery().setParenthesized(queryExpr.isParenthesized());
SQLSelectQuery query = this.createSelectParser().queryRest(queryExpr.getSubQuery().getQuery(), true);
if (query != queryExpr.getSubQuery()) {
queryExpr.getSubQuery().setQuery(query);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1139,7 +1139,7 @@ public SQLTableSource parseTableSource() {
if (query instanceof SQLUnionQuery) {
tableSource = new SQLUnionQueryTableSource((SQLUnionQuery) query);
} else {
tableSource = new SQLSubqueryTableSource(select);
tableSource = SQLSubqueryTableSource.fixParenthesized(new SQLSubqueryTableSource(select));
}
} else if (lexer.token == Token.LPAREN) {
tableSource = parseTableSource();
Expand Down Expand Up @@ -1606,7 +1606,7 @@ public SQLTableSource parseTableSourceRest(SQLTableSource tableSource) {
|| (lexer.token == Token.WITH && dbType == DbType.mysql)
|| (lexer.token == Token.FROM && (dbType == DbType.odps || dbType == DbType.hive))) {
SQLSelect select = this.select();
rightTableSource = new SQLSubqueryTableSource(select);
rightTableSource = SQLSubqueryTableSource.fixParenthesized(new SQLSubqueryTableSource(select));
} else {
rightTableSource = this.parseTableSource();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5347,7 +5347,7 @@ public SQLStatement parseMerge() {
if (lexer.token == Token.LPAREN) {
lexer.nextToken();
SQLSelect select = this.createSQLSelectParser().select();
SQLSubqueryTableSource tableSource = new SQLSubqueryTableSource(select);
SQLSubqueryTableSource tableSource = SQLSubqueryTableSource.fixParenthesized(new SQLSubqueryTableSource(select));
stmt.setInto(tableSource);
accept(Token.RPAREN);
} else {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.alibaba.druid.bvt.sql.dm;

import com.alibaba.druid.DbType;
import com.alibaba.druid.sql.SQLParseAssertUtil;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.statement.SQLMergeStatement;
Expand All @@ -27,7 +28,7 @@ public void test_0() throws Exception {
"WHEN MATCHED THEN UPDATE SET login_name = ?, dept_name = ?, ipaddr = ?, login_location = ?, browser = ?, os = ?, status = ?, start_timestamp = ?, last_access_time = ?, expire_time = ?\n" +
"\tWHERE sessionid = ?\n" +
"WHEN NOT MATCHED THEN INSERT (SESSIONID, LOGIN_NAME, DEPT_NAME, IPADDR, LOGIN_LOCATION, BROWSER, OS, STATUS, START_TIMESTAMP, LAST_ACCESS_TIME, EXPIRE_TIME) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", stmt.toString());

SQLParseAssertUtil.assertParseSql(sql, DbType.dm);
}

public void test_1() throws Exception {
Expand All @@ -48,6 +49,6 @@ public void test_1() throws Exception {
"WHEN MATCHED THEN UPDATE SET login_name = ?, dept_name = ?, ipaddr = ?, login_location = ?, browser = ?, os = ?, status = ?, start_timestamp = ?, last_access_time = ?, expire_time = ?\n" +
"\tWHERE sessionid = ?\n" +
"WHEN NOT MATCHED THEN INSERT (SESSIONID, LOGIN_NAME, DEPT_NAME, IPADDR, LOGIN_LOCATION, BROWSER, OS, STATUS, START_TIMESTAMP, LAST_ACCESS_TIME, EXPIRE_TIME) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", stmt.toString());

SQLParseAssertUtil.assertParseSql(sql, DbType.dm);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
package com.alibaba.druid.bvt.sql.hive;

import com.alibaba.druid.DbType;
import com.alibaba.druid.sql.SQLParseAssertUtil;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.hive.ast.HiveMultiInsertStatement;
Expand Down Expand Up @@ -257,6 +258,6 @@ public void test_0() throws Exception {
"GROUP BY ddate, game_id, plat_id, channel_group_id, channel_id, zone_id, reg_day_num_td_segment_id;", stmt.toString());

// SQLUtils.toSQLString(stmt, DbType.hive)

SQLParseAssertUtil.assertParseSql(sql, DbType.hive);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -210,13 +210,13 @@ public void test_types() throws Exception {
"\t, M.customize_sites_id, M.spare_flag\n" +
"FROM TCP_CPR.DIFF_CON_CONFIG_MODULE_V M\n" +
"\tLEFT JOIN (\n" +
"\t\tSELECT 0 AS osg_type_id, v.contract_module_id, v.item_id, v.contract_item_id, v.item_des\n" +
"\t\t(SELECT 0 AS osg_type_id, v.contract_module_id, v.item_id, v.contract_item_id, v.item_des\n" +
"\t\t\t, v.item_type, v.ITEM_QUANTITY, v.cost_price, v.COST_PRICE_PARAMETER, v.CONFIRM_FLAG\n" +
"\t\t\t, v.COST_PRICE04, v.CONFIRM_ITEM_PARAM, v.CONFIRM_FLAG04, v.OLD_COST, v.LIST_PRICE\n" +
"\t\t\t, v.ITEM_CODE, v.CONFIRM_COST_PRICE04\n" +
"\t\tFROM TCP_CPR.DIFF_CON_CONFIG_ITEM_V v\n" +
"\t\tFROM TCP_CPR.DIFF_CON_CONFIG_ITEM_V v)\n" +
"\t\tUNION ALL\n" +
"\t\tSELECT header.product_id AS osg_type_id, HEADER.PARENT_ID AS CONTRACT_MODULE_ID, HEADER.SERIAL_ID AS item_id, HEADER.OSG_HEADER_ID AS CONTRACT_ITEM_ID, ser.product_serial AS item_name\n" +
"\t\t(SELECT header.product_id AS osg_type_id, HEADER.PARENT_ID AS CONTRACT_MODULE_ID, HEADER.SERIAL_ID AS item_id, HEADER.OSG_HEADER_ID AS CONTRACT_ITEM_ID, ser.product_serial AS item_name\n" +
"\t\t\t, 'OSG' AS item_type, HEADER.QUANTITY AS item_quantity\n" +
"\t\t\t, (LINE.REF_PRICE + nvl(REPLY.MARKET_REFERENCE_PRICE, 0)) AS COST_PRICE\n" +
"\t\t\t, 1 AS COST_PRICE_PARAMETER, 'Y' AS CONFIRM_FLAG, 0 AS COST_PRICE04, 1 AS CONFIRM_ITEM_PARAM, 'Y' AS CONFIRM_FLAG04\n" +
Expand All @@ -235,16 +235,16 @@ public void test_types() throws Exception {
"\t\tWHERE HEADER.ENABLED_FLAG = 'Y'\n" +
"\t\t\tAND ser.serial_id = HEADER.Serial_Id\n" +
"\t\t\tAND header.REPLY_ID = reply.reply_head_id(+)\n" +
"\t\t\tAND header.OSG_HEADER_ID = line.OSG_HEADER_ID\n" +
"\t\t\tAND header.OSG_HEADER_ID = line.OSG_HEADER_ID)\n" +
"\t\tUNION ALL\n" +
"\t\tSELECT item.osg_type_id AS osg_type_id, ITEM.PARENT_ID AS CONTRACT_MODULE_ID, item.osg_item_id AS item_id, ITEM.OSG_ITEM_ID AS CONTRACT_ITEM_ID, SYS_ITEM.DESCRIPTION AS item_name\n" +
"\t\t(SELECT item.osg_type_id AS osg_type_id, ITEM.PARENT_ID AS CONTRACT_MODULE_ID, item.osg_item_id AS item_id, ITEM.OSG_ITEM_ID AS CONTRACT_ITEM_ID, SYS_ITEM.DESCRIPTION AS item_name\n" +
"\t\t\t, 'SINGLEOSG' AS item_type, ITEM.QUANTITY AS item_quantity, SYS_ITEM.MARKET_REFERENCE_PRICE AS COST_PRICE, 1 AS COST_PRICE_PARAMETER, SYS_ITEM.ENABLED_FLAG AS CONFIRM_FLAG\n" +
"\t\t\t, 0 AS COST_PRICE04, 1 AS CONFIRM_ITEM_PARAM, 'Y' AS CONFIRM_FLAG04, 1 AS OLD_COST -- SYS_ITEM.LIST_PRICE LIST_PRICE,\n" +
"\t\t\t, ITEM.LIST_PRICE AS LIST_PRICE, SYS_ITEM.INVENTORY_ID || '\n" +
"+Mn\u0016-�' AS ITEM_CODE, SYS_ITEM.PRICE AS CONFIRM_COST_PRICE04 -- , 0 PROD_ATTRIBUTE_ID--,0 ITEM_CHIP\n" +
"\t\tFROM TCP_CPR.DIFF_CON_OSG3A_HEADERS ITEM, ERP_ZTE.ZTE_KX_OSG3_ITEMS SYS_ITEM\n" +
"\t\tWHERE ITEM.OSG_ITEM_ID = SYS_ITEM.OSG_ITEM_ID\n" +
"\t\t\tAND ITEM.ENABLED_FLAG = 'Y'\n" +
"\t\t\tAND ITEM.ENABLED_FLAG = 'Y')\n" +
"\t) I ON M.CONTRACT_MODULE_ID = I.CONTRACT_MODULE_ID \n" +
"WHERE item_quantity >= 0",//
SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@ public void test_types() throws Exception {

Assert.assertEquals("CREATE TABLE sto_scandata_bak_2013_05_08_023000" //
+ "\nAS"//
+ "\nSELECT *"//
+ "\n(SELECT *"//
+ "\nFROM sto_scandata t"//
+ "\nWHERE t.delflag = 1",//
+ "\nWHERE t.delflag = 1)",//
SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE));

OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public void test_parse_union() throws Exception {
for (DbType dbType : new DbType[]{
//DbType.mysql,
//DbType.oracle,
DbType.postgresql,
DbType.oscar,
}) {
for (String sql : new String[]{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,11 @@ public void test_0() throws Exception {
"FROM v.e\n" +
"WHERE cid <> rid\n" +
"\tAND rid NOT IN (\n" +
"\t\tSELECT DISTINCT rid\n" +
"\t\tFROM v.s\n" +
"\t\t(SELECT DISTINCT rid\n" +
"\t\tFROM v.s)\n" +
"\t\tUNION\n" +
"\t\tSELECT DISTINCT rid\n" +
"\t\tFROM v.p\n" +
"\t\t(SELECT DISTINCT rid\n" +
"\t\tFROM v.p)\n" +
"\t)\n" +
"\tAND TIMESTAMP <= 1298505600000", text);
}
Expand Down
8 changes: 4 additions & 4 deletions core/src/test/resources/bvt/parser/oracle-25.txt
Original file line number Diff line number Diff line change
Expand Up @@ -53,25 +53,25 @@ FROM (
FROM (
SELECT results.*, row_number() OVER (PARTITION BY results.object_id ORDER BY results.gmt_modified DESC) AS rn
FROM (
SELECT sus.ID AS ID, sus.GMT_CREATE AS GMT_CREATE, sus.GMT_MODIFIED AS GMT_MODIFIED, sus.COMPANY_ID AS COMPANY_ID, sus.OBJECT_ID AS OBJECT_ID
(SELECT sus.ID AS ID, sus.GMT_CREATE AS GMT_CREATE, sus.GMT_MODIFIED AS GMT_MODIFIED, sus.COMPANY_ID AS COMPANY_ID, sus.OBJECT_ID AS OBJECT_ID
, sus.OBJECT_TYPE AS OBJECT_TYPE, sus.CONFIRM_TYPE AS CONFIRM_TYPE, sus.OPERATOR AS OPERATOR, sus.FILTER_TYPE AS FILTER_TYPE, sus.MEMBER_ID AS MEMBER_ID
, sus.MEMBER_FUC_Q AS MEMBER_FUC_Q, sus.RISK_TYPE AS RISK_TYPE, 'Y' AS IS_DRAFT
FROM f_U_c_ sus, a_b_c_draft p, member m
WHERE 1 = 1
AND p.company_id = m.company_id
AND m.login_id = ?
AND p.sale_type IN (?)
AND p.id = sus.object_id
AND p.id = sus.object_id)
UNION
SELECT sus.ID AS ID, sus.GMT_CREATE AS GMT_CREATE, sus.GMT_MODIFIED AS GMT_MODIFIED, sus.COMPANY_ID AS COMPANY_ID, sus.OBJECT_ID AS OBJECT_ID
(SELECT sus.ID AS ID, sus.GMT_CREATE AS GMT_CREATE, sus.GMT_MODIFIED AS GMT_MODIFIED, sus.COMPANY_ID AS COMPANY_ID, sus.OBJECT_ID AS OBJECT_ID
, sus.OBJECT_TYPE AS OBJECT_TYPE, sus.CONFIRM_TYPE AS CONFIRM_TYPE, sus.OPERATOR AS OPERATOR, sus.FILTER_TYPE AS FILTER_TYPE, sus.MEMBER_ID AS MEMBER_ID
, sus.MEMBER_FUC_Q AS MEMBER_FUC_Q, sus.RISK_TYPE AS RISK_TYPE, 'N' AS IS_DRAFT
FROM f_U_c_ sus, a_b_c p, member m
WHERE 1 = 1
AND p.company_id = m.company_id
AND m.login_id = ?
AND p.sale_type IN (?)
AND p.id = sus.object_id
AND p.id = sus.object_id)
) results
)
WHERE rn = 1
Expand Down
4 changes: 2 additions & 2 deletions core/src/test/resources/bvt/parser/postgresql-9.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,6 @@ CREATE TABLE issue_changes_copy (
issue_change_creation_date
)
AS
SELECT CAST(id AS VARCHAR(40)) AS uuid, kee, issue_key, user_login, change_type
(SELECT CAST(id AS VARCHAR(40)) AS uuid, kee, issue_key, user_login, change_type
, change_data, created_at, updated_at, issue_change_creation_date
FROM issue_changes
FROM issue_changes)

0 comments on commit c985edb

Please sign in to comment.