apache / apache/shardingsphere
SQLServerFunctionOption wrongly lists Oracle ROWNUM pseudo-columns as unparenthesized functions
- Dominant language
- Java
- Stars
- 20.8k
- Forks
- 6.9k
- Avg merge
- 11h 38m
- Merged PRs (30d)
- 326
Description
## Bug Report
### Which version of ShardingSphere did you use?
master @ a14fa59423c
### Which project did you use? ShardingSphere-JDBC or ShardingSphere-Proxy?
Both (kernel-level SQL binder)
### Expected behavior
On SQL Server, a real column named `ROWNUM` (or `ROWNUM_`, `ROW_NUMBER`) is bound as a column so it resolves to its owner table.
### Actual behavior
`ColumnSegmentBinder.isUnparenthesizedFunction()` treats such an identifier as a niladic function and skips column binding, producing wrong bind output.
### Reason analyze (If you can)
`SQLServerFunctionOption.getUnparenthesizedFunctionNames()` (database/connector/dialect/sqlserver/.../metadata/database/option/SQLServerFunctionOption.java line 32) lists `ROWNUM`, `ROWNUM_`, `ROW_NUMBER`. These are Oracle pseudo-columns; SQL Server has no `ROWNUM`/`ROWNUM_`, and `ROW_NUMBER` always requires `()` + `OVER`. Only Oracle among the sibling dialects legitimately keeps them. A maintainer TODO on line 31 already flagged their removal. The set is consumed by `ColumnSegmentBinder.isUnparenthesizedFunction()` (infra/binder/core/.../expression/type/ColumnSegmentBinder.java line 141-143), which skips binding for any identifier in the set.
### Steps to reproduce the behavior, such as: SQL to execute, sharding rule configuration, when exception occur etc.
Bind `SELECT ROWNUM FROM t` against a SQL Server table `t` having a `ROWNUM` column; the column is not bound to `t`.
### Example codes for reproduce this issue (such as a github link).
N/A
Contributor guide
Research direction
Start in database/connector/dialect/sqlserver/.../metadata/database/option/SQLServerFunctionOption.java around getUnparenthesizedFunctionNames() and review the TODO on line 31. Check how ColumnSegmentBinder.isUnparenthesizedFunction() consumes this set, then reproduce with SELECT ROWNUM FROM t against a SQL Server table containing a ROWNUM column. Done means the identifier binds to table t rather than being treated as a niladic function.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java, sql
- Domain
- databases
- Issue type
- Bug
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Activity status
- Quiet
- Clarity
- Clearly specified
- Newbie friendliness
- 82/100