INTERVAL sharding algorithm throws IllegalArgumentException on one-sided range outside datetime bounds
Bug Report
Which version of ShardingSphere did you use?
master @ 101c3d56ccd
Which project did you use? ShardingSphere-JDBC or ShardingSphere-Proxy?
Both
Expected behavior
A one-sided range (<, <=, >, >=) on an INTERVAL sharding column outside datetime-lower/datetime-upper routes like the equivalent closed range: empty, or the overlapping slot tables.
Actual behavior
Raw java.lang.IllegalArgumentException: Invalid range: [2021-06-01T00:00..2021-05-01T00:00) from Guava, while the same closed range returns an empty set and AUTO_INTERVAL clamps without throwing.
Reason analyze (If you can)
IntervalShardingAlgorithm.hasIntersection() (features/sharding/core, line 160-168) substitutes datetime-lower/datetime-upper for the missing endpoint and calls Range.range(lower, ..., upper, ...); outside the window lower > upper and Guava rejects it. The substitution also turns > datetime-upper into an empty range, silently skipping the last slot table.
Steps to reproduce the behavior, such as: SQL to execute, sharding rule configuration, when exception occur etc.
INTERVALwithdatetime-pattern=yyyy-MM-dd HH:mm:ss,datetime-lower=2021-06-01 00:00:00,datetime-upper=2021-07-31 00:00:00,sharding-suffix-pattern=yyyyMMdd,datetime-interval-amount=2.SELECT * FROM t_order WHERE create_time < '2021-05-01 00:00:00';orcreate_time >= '2021-08-02 00:00:00'->IllegalArgumentException.- With
datetime-upperomitted (defaults to startup time),create_time > '<after startup>'fails too.
Example codes for reproduce this issue (such as a github link).
N/A
Source: apache/shardingsphere