Bug Report
Which version of ShardingSphere did you use?
master @ a14fa59
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
Bug Report
Which version of ShardingSphere did you use?
master @ a14fa59
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(orROWNUM_,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) listsROWNUM,ROWNUM_,ROW_NUMBER. These are Oracle pseudo-columns; SQL Server has noROWNUM/ROWNUM_, andROW_NUMBERalways 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 byColumnSegmentBinder.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 tagainst a SQL Server tablethaving aROWNUMcolumn; the column is not bound tot.Example codes for reproduce this issue (such as a github link).
N/A