alibaba / alibaba/druid

oracle union 包含子查询解析异常

Open
#5,347 0 comments 0 reactions 0 assignees View on GitHub
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

image
这里的if判断的token 已经被accept 中的父级给覆盖

Contributor guide

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.