apache / apache/shardingsphere

SQLServerFunctionOption wrongly lists Oracle ROWNUM pseudo-columns as unparenthesized functions

Open Beginner friendly
#39,100 0 comments 0 reactions 0 assignees View on GitHub
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

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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.