oracle union 包含子查询解析异常
- Dominant language
- Java
- Stars
- 28.2k
- Forks
- 8.6k
- PR merge metrics
- No merged PRs in 30d
Description
```sql
SELECT
DBMS_METADATA.GET_DDL('TABLE', OBJECT_NAME, OWNER)
FROM
dba_objects
WHERE
owner = 'username'
AND object_name in ('tablename')
AND object_type = 'TABLE'
UNION ALL
SELECT
DBMS_METADATA.GET_DDL('INDEX', INDEX_NAME, OWNER)
FROM (SELECT
index_name, owner
FROM
dba_indexes
WHERE
owner = 'username'
AND table_name in ('tablename')
AND generated = 'N'
MINUS
SELECT
index_name, owner
FROM
dba_constraints
WHERE
owner = 'username'
AND table_name in ('tablename')
)
UNION ALL
SELECT
DBMS_METADATA.GET_DEPENDENT_DDL('COMMENT', TABLE_NAME, OWNER)
FROM (SELECT
table_name, owner
FROM
dba_col_comments
WHERE
owner = 'username'
AND table_name in ('tablename')
AND comments is not null
UNION
SELECT
table_name, owner
FROM
dba_tab_comments
WHERE
owner = 'username'
and table_name in ('tablename')
and comments is not null
)
```
解析union和子查询一起使用的时候。会把父级的union 算到了子查询中。解析后到格式
```sql
SELECT DBMS_METADATA.GET_DDL('TABLE', OBJECT_NAME, OWNER)
FROM dba_objects
WHERE owner = 'username'
AND object_name IN ('tablename')
AND object_type = 'TABLE'
UNION ALL
SELECT DBMS_METADATA.GET_DDL('INDEX', INDEX_NAME, OWNER)
FROM (
SELECT index_name, owner
FROM dba_indexes
WHERE owner = 'username'
AND table_name IN ('tablename')
AND generated = 'N'
MINUS
SELECT index_name, owner
FROM dba_constraints
WHERE owner = 'username'
AND table_name IN ('tablename')
UNION ALL
SELECT DBMS_METADATA.GET_DEPENDENT_DDL('COMMENT', TABLE_NAME, OWNER)
FROM (
SELECT table_name, owner
FROM dba_col_comments
WHERE owner = 'username'
AND table_name IN ('tablename')
AND comments IS NOT NULL
UNION
SELECT table_name, owner
FROM dba_tab_comments
WHERE owner = 'username'
AND table_name IN ('tablename')
AND comments IS NOT NULL
)
)
```
初步分析代码问题在
com.alibaba.druid.sql.dialect.oracle.parser.OracleSelectParser#parseTableSourcePrimary
这里的if判断的token 已经被accept 中的父级给覆盖
Contributor guide
Research direction
Start at com.alibaba.druid.sql.dialect.oracle.parser.OracleSelectParser#parseTableSourcePrimary and reproduce the issue with the SQL shown in the report. Trace token handling around the parent UNION and nested subqueries; done means the outer UNION ALL clauses remain at the outer level rather than being inserted into the nested query.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java, sql
- Domain
- databases
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 45/100