apache / apache/shardingsphere
In the federation scenario,the select syntax of "order by nlssort" does not support.
- Dominant language
- Java
- Stars
- 20.8k
- Forks
- 6.9k
- Avg merge
- 11h 35m
- Merged PRs (30d)
- 326
Description
### Which version of ShardingSphere did you use?
we find java version: java8, full_version=1.8.0_282, full_path=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-1.el7_9.x86_64/bin/java
ShardingSphere-5.2.2-SNAPSHOT
Commit ID: dirty-631fdf40f87223e176abe5c851a51b3287b4d6de
Commit Message: Fix wrong decide result when execute same sharding condition subquery with sql federation (https://github.com/apache/shardingsphere/pull/22754)
Branch: https://github.com/apache/shardingsphere/commit/631fdf40f87223e176abe5c851a51b3287b4d6de
Build time: 2022-12-12T10:48:40+0800
### Which project did you use? ShardingSphere-JDBC or ShardingSphere-Proxy?
ShardingSphere-Proxy
### Expected behavior
In the federation scenario,the select syntax of "order by nlssort" is supported.
### Actual behavior
In the federation scenario,the select syntax of "order by nlssort" does not support.
### Reason analyze (If you can)
### Steps to reproduce the behavior, such as: SQL to execute, sharding rule configuration, when exception occur etc.
```
select * from t_new_order o inner join t_merchant m using(merchant_id) where o.user_id > 10 and o.user_id < 15 order by nlssort(remark, 'nls_sort = generic_m_ci');
select * from t_new_order o inner join t_merchant m using(merchant_id) where o.user_id > 10 and o.user_id < 15 order by nlssort(remark, 'nls_sort = generic_m_ci') desc;
--view
create view select_view as select * from t_new_order where user_id <=25 and user_id>15 order by nlssort(remark, 'nls_sort = generic_m_ci'),order_id,user_id;
select * from select_view;
drop view select_view;
```
**the result of sharding**
```
select * from t_new_order o inner join t_merchant m using(merchant_id) where o.user_id > 10 and o.user_id < 15 order by nlssort(remark, 'nls_sort = generic_m_ci');
[7.212.123.28:56526/7.212.123.28:11000] ERROR: At line 0, column 0: No match found for function signature nlssort(, )
select * from t_new_order o inner join t_merchant m using(merchant_id) where o.user_id > 10 and o.user_id < 15 order by nlssort(remark, 'nls_sort = generic_m_ci') desc;
[7.212.123.28:56526/7.212.123.28:11000] ERROR: At line 0, column 0: No match found for function signature nlssort(, )
--view
create view select_view as select * from t_new_order where user_id <=25 and user_id>15 order by nlssort(remark, 'nls_sort = generic_m_ci'),order_id,user_id;
SQL SUCCESS
select * from select_view;
[7.212.123.28:56558/7.212.123.28:11000] ERROR: Error while parsing view definition: select * from t_new_order where user_id <=25 and user_id>15 order by nlssort(remark, 'nls_sort = generic_m_ci'),order_id,user_id
drop view select_view;
SQL SUCCESS
```
### Example codes for reproduce this issue (such as a github link).
```
drop table if exists t_new_order;
drop table if exists t_merchant;
create table t_new_order (order_id int primary key, user_id int not null, status varchar(50) not null, merchant_id int not null, remark varchar(50), creation_date date);
create table t_merchant (merchant_id int primary key, country_id int not null, merchant_name varchar(50) not null, business_code varchar(50) not null, telephone varchar(50) not null, creation_date date not null);
insert into t_new_order values(1000, 10, 'init', 1, 'test', '2017-07-08');
insert into t_new_order values(1001, 10, 'init', 2, 'test', '2017-07-08');
insert into t_new_order values(2000, 20, 'init', 3, 'test', '2017-08-08');
insert into t_new_order values(2001, 20, 'init', 4, 'Test', '2017-08-08');
insert into t_new_order values(1100, 11, 'init', 5, 'TESt', '2017-08-08');
insert into t_new_order values(1101, 11, 'init', 6, 'test', '2017-08-08');
insert into t_new_order values(2100, 21, 'finish', 7, 'test', '2017-08-08');
insert into t_new_order values(2101, 21, 'finish', 8, 'TEST', '2017-08-08');
insert into t_new_order values(1200, 12, 'finish', 9, 'finish', '2017-08-08');
insert into t_new_order values(1201, 12, 'finish', 10, 'test22', '2017-08-18');
insert into t_new_order values(2200, 22, 'finish', 11, 'test', '2017-08-18');
insert into t_new_order values(2201, 22, 'finish', 12, 'test', '2017-08-18');
insert into t_new_order values(1300, 13, 'finish', 13, '', '2017-08-18');
insert into t_new_order values(1301, 13, 'finish', 14, 'TEST01', '2017-08-18');
insert into t_new_order values(2300, 23, 'finish ', 15, 'test', '2017-08-18');
insert into t_new_order values(2301, 23, 'finish', 16, 'TESt16', '2017-08-18');
insert into t_new_order values(1400, 14, 'init', 17, '', '2017-08-18');
insert into t_new_order values(1401, 14, 'init', 18, 'test', '2017-08-18');
insert into t_new_order values(2400, 24, 'init', 19, 'test', '2017-08-18');
insert into t_new_order values(2401, 24, 'init', 20, 'test', '2017-08-18');
insert into t_new_order values(1500, 15, 'init', 1, '', '2017-08-28');
insert into t_new_order values(1501, 15, 'init', 2, 'test', '2017-08-28');
insert into t_new_order values(2500, 25, 'init', 3, 'test', '2017-08-28');
insert into t_new_order values(2501, 25, 'init', 4, 'test', '2017-08-28');
insert into t_new_order values(1600, 16, 'init', 5, 'test', '2017-08-28');
insert into t_new_order values(1601, 16, 'init', 6, '', '2017-08-28');
insert into t_new_order values(2600, 26, 'init', 7, 'test', '2017-08-28');
insert into t_new_order values(2601, 26, 'init', 8);
insert into t_new_order values(1700, 17, 'init', 9, 'test', '2017-08-28');
insert into t_new_order values(1701, 17, 'finish', 10, 'test', '2017-08-18');
insert into t_new_order values(2700, 27, 'finish', 11, 'test', '2017-08-18');
insert into t_new_order values(2701, 27, 'finish', 12, 'test', '2017-08-18');
insert into t_new_order values(1800, 18, 'finish', 13, 'test', '2017-08-18');
insert into t_new_order values(1801, 18, 'finish', 14);
insert into t_new_order values(2800, 28, 'finish', 15, 'test', '2017-08-18');
insert into t_new_order values(2801, 28, 'finish', 16, 'test', '2017-08-18');
insert into t_new_order values(1900, 19, 'init', 17, 'test', '2017-08-18');
insert into t_new_order values(1901, 19, 'init', 18, 'test', '2017-08-18');
insert into t_new_order values(2900, 29, 'init', 19, 'test', '2017-08-18');
insert into t_new_order values(2901, 29, 'init', 20, 'test', '2017-08-18');
insert into t_new_order values(1902, 19, 'init', 17, 'test11', '2017-08-18');
insert into t_new_order values(1903, 19, 'init', 18, 'test12', '2017-08-18');
insert into t_new_order values(2902, 29, 'init', 19, 'test', '2017-08-18');
insert into t_new_order values(2903, 29, 'init', 20, 'test', '2017-08-18');
insert into t_merchant values(1, 86, 'tencent', '86000001', '86100000001', '2017-08-08');
insert into t_merchant values(2, 86, 'haier', '86000002', '86100000002', '2017-08-08');
insert into t_merchant values(3, 86, 'huawei', '86000003', '86100000003', '2017-08-08');
insert into t_merchant values(4, 86, 'alibaba', '86000004', '86100000004', '2017-08-08');
insert into t_merchant values(5, 86, 'lenovo', '86000005', '86100000005', '2017-08-08');
insert into t_merchant values(6, 86, 'moutai', '86000006', '86100000006', '2017-12-08');
insert into t_merchant values(7, 86, 'baidu', '86000007', '86100000007', '2017-08-08');
insert into t_merchant values(8, 86, 'xiaomi', '86000008', '86100000008', '2017-08-08');
insert into t_merchant values(9, 86, 'vivo', '86000009', '86100000009', '2017-11-08');
insert into t_merchant values(10, 86, 'oppo', '86000010', '86100000010', '2017-08-08');
insert into t_merchant values(11, 1, 'google', '01000011', '01100000011', '2017-08-08');
insert into t_merchant values(12, 1, 'walmart', '01000012', '01100000012', '2017-08-18');
insert into t_merchant values(13, 1, 'amazon', '01000013', '01100000013', '2017-08-08');
insert into t_merchant values(14, 1, 'apple', '01000014', '01100000014', '2017-07-08');
insert into t_merchant values(15, 1, 'microsoft', '01000015', '01100000015', '2017-08-08');
insert into t_merchant values(16, 1, 'dell', '01000016', '01100000016', '2017-08-08');
insert into t_merchant values(17, 1, 'johnson', '01000017', '01100000017', '2017-08-08');
insert into t_merchant values(18, 1, 'intel', '01000018', '01100000018', '2017-06-08');
insert into t_merchant values(19, 1, 'hp', '01000019', '01100000019', '2017-08-08');
insert into t_merchant values(20, 1, 'tesla', '01000020', '01100000020', '2017-08-08');
```
```
schemaName: test_db
dataSources:
ds_0:
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 260
minPoolSize: 10
password: Test@123
url: jdbc:opengauss://90.90.44.171:14000/test_db?batchMode=on
username: tpccuser
ds_1:
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 260
minPoolSize: 10
password: Test@123
url: jdbc:opengauss://90.90.44.171:15000/test_db?batchMode=on
username: tpccuser
rules:
- !SHARDING
tables:
t_user:
actualDataNodes: ds_0.t_user
t_product:
actualDataNodes: ds_0.t_product
t_merchant:
actualDataNodes: ds_1.t_merchant
t_product_detail:
actualDataNodes: ds_1.t_product_detail
t_order:
actualDataNodes: ds_${0..1}.t_order
databaseStrategy:
standard:
shardingColumn: user_id
shardingAlgorithmName: database_inline
t_order_item:
actualDataNodes: ds_${0..1}.t_order_item
databaseStrategy:
standard:
shardingColumn: user_id
shardingAlgorithmName: database_inline
t_order_item1:
actualDataNodes: ds_${0..1}.t_order_item1
databaseStrategy:
standard:
shardingColumn: user_id
shardingAlgorithmName: database_inline
t_new_order:
actualDataNodes: ds_${0..1}.t_new_order_${0..1}
databaseStrategy:
standard:
shardingAlgorithmName: database_inline
shardingColumn: user_id
tableStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: table_inline
bindingTables:
- t_order,t_order_item
broadcastTables:
- t_product_category
- t_country
shardingAlgorithms:
database_inline:
type: INLINE
props:
algorithm-expression: ds_${user_id % 2}
allow-range-query-with-inline-sharding: true
table_inline:
type: INLINE
props:
algorithm-expression: t_new_order_${order_id % 2}
allow-range-query-with-inline-sharding: true
mode:
type: Cluster
repository:
type: ZooKeeper
props:
namespace: governance_ds
server-lists: 7.212.123.28:2181
retryIntervalMilliseconds: 500
timeToLiveSeconds: 60
maxRetries: 3
operationTimeoutMilliseconds: 500
authority:
users:
- user: root@%
password: root
- user: sharding
password: sharding
privilege:
type: ALL_PERMITTED
rules:
- !TRANSACTION
defaultType: XA
providerType: Atomikos
props:
sql-show: true
```
Contributor guide
Research direction
Start by reproducing the supplied SELECT and view statements in ShardingSphere-Proxy with the listed federation and sharding configuration. Trace the federation handling of the nlssort expression and compare the direct queries with the view case. Done means the shown nlssort order-by forms are accepted in federation queries and view definitions without the reported parsing errors.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java, sql
- Domain
- databases, distributed-systems
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100