Skip to content

SQLServerFunctionOption wrongly lists Oracle ROWNUM pseudo-columns as unparenthesized functions #39100

Description

@thswlsqls

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions