134130 opened a new issue, #27879: URL: https://github.com/apache/shardingsphere/issues/27879
## Bug Report **For English only**, other languages will not accept. Before report a bug, make sure you have: - Searched open and closed [GitHub issues](https://github.com/apache/shardingsphere/issues). - Read documentation: [ShardingSphere Doc](https://shardingsphere.apache.org/document/current/en/overview). Please pay attention on issues you submitted, because we maybe need more details. If no response anymore and we cannot reproduce it on current information, we will **close it**. Please answer these questions before submitting your issue. Thanks! ### Which version of ShardingSphere did you use? 5.4.0 ### Which project did you use? ShardingSphere-JDBC or ShardingSphere-Proxy? ShardingSphere-JDBC with SharingSphere-Mask ### Expected behavior ```json [ { "actor_id": 77, "film_id": 8, "last_update": "2006-02-15 05:03:42", "first_name": "CARY", "last_name": "M********Y", "title": "AIRPORT POLLOCK", "description": "A Epic Tale of a Moose And a Girl who must Confront a Monkey in Ancient India", "release_year": 2006, "language_id": 1, "original_language_id": null, "rental_duration": 6, "rental_rate": 4.99, "length": 54, "replacement_cost": 15.99, "rating": "R", "special_features": "Trailers" } ] ``` ### Actual behavior ```json [ { "actor_id": 1, "first_name": 1, "last_name": "2006-02-15 05:05:03", "last_update": 79 } ] ``` ### Reason analyze (If you can) May MaskingContext pollute MetadataContext ### Steps to reproduce the behavior, such as: SQL to execute, sharding rule configuration, when exception occur etc. 1. build.gradle.kts ```kotlin dependencies { // ShardingSphere implementation("org.apache.shardingsphere:shardingsphere:5.4.0") implementation("org.apache.shardingsphere:shardingsphere-jdbc:5.4.0") implementation("org.apache.shardingsphere:shardingsphere-jdbc-core:5.4.0") // ShardingSphere Mask implementation("org.apache.shardingsphere:shardingsphere-mask:5.4.0") implementation("org.apache.shardingsphere:shardingsphere-mask-api:5.4.0") implementation("org.apache.shardingsphere:shardingsphere-mask-core:5.4.0") implementation("org.apache.shardingsphere:shardingsphere-mask-distsql:5.4.0") implementation("org.apache.shardingsphere:shardingsphere-mask-distsql-parser:5.4.0") implementation("org.apache.shardingsphere:shardingsphere-mask-distsql-statement:5.4.0") implementation("org.apache.shardingsphere:shardingsphere-mask-distsql-handler:5.4.0") implementation("org.apache.shardingsphere:shardingsphere-mask-distsql-parser:5.4.0") // jdbc runtimeOnly("com.mysql:mysql-connector-j") } ``` 2. Prepare MySQL ```shell docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -d -p 3306:3306 mysql ``` 3. Run these SQLs ```sql -- Sakila MySQL Sample Database: https://dev.mysql.com/doc/sakila/en/ -- Use sakila or run this query. CREATE DATABASE sakila; USE sakila; -- DDL CREATE TABLE `actor` ( `actor_id` smallint unsigned NOT NULL AUTO_INCREMENT, `first_name` varchar(45) NOT NULL, `last_name` varchar(45) NOT NULL, `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`actor_id`) ); CREATE TABLE `film` ( `film_id` smallint unsigned NOT NULL AUTO_INCREMENT, `title` varchar(128) NOT NULL, `description` text, `release_year` year DEFAULT NULL, `language_id` tinyint unsigned NOT NULL, `original_language_id` tinyint unsigned DEFAULT NULL, `rental_duration` tinyint unsigned NOT NULL DEFAULT '3', `rental_rate` decimal(4,2) NOT NULL DEFAULT '4.99', `length` smallint unsigned DEFAULT NULL, `replacement_cost` decimal(5,2) NOT NULL DEFAULT '19.99', `rating` enum('G','PG','PG-13','R','NC-17') DEFAULT 'G', `special_features` set('Trailers','Commentaries','Deleted Scenes','Behind the Scenes') DEFAULT NULL, `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`film_id`) ); CREATE TABLE `film_actor` ( `actor_id` smallint unsigned NOT NULL, `film_id` smallint unsigned NOT NULL, `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`actor_id`,`film_id`) ); -- DML INSERT INTO sakila.actor (actor_id, first_name, last_name, last_update, social_number) VALUES (1, 'PENELOPE', 'GUINESS', '2006-02-15 04:34:33', '010-1234-1234'); INSERT INTO sakila.film (film_id, title, description, release_year, language_id, original_language_id, rental_duration, rental_rate, length, replacement_cost, rating, special_features, last_update) VALUES (1, 'ACADEMY DINOSAUR', 'A Epic Drama of a Feminist And a Mad Scientist who must Battle a Teacher in The Canadian Rockies', 2006, 1, null, 6, 0.99, 86, 20.99, 'PG', 'Deleted Scenes,Behind the Scenes', '2006-02-15 05:03:42'); INSERT INTO sakila.film_actor (actor_id, film_id, last_update) VALUES (1, 1, '2006-02-15 05:05:03'); ``` 4. Run this Query with ShardingSphere-Masking ```sql SELECT * FROM film_actor JOIN actor AS a ON a.actor_id JOIN film AS f ON f.film_id LIMIT 1; ``` ### Example codes for reproduce this issue (such as a github link). ```kotlin fun main() { // Hikari val hikariDataSource = HikariDataSource().apply { driverClassName = "com.mysql.jdbc.Driver" jdbcUrl = "jdbc:mysql://localhost:3306/sakila" username = "root" password = "root" } // ShardingSphere val maskRuleConfiguration = MaskRuleConfiguration( Collections.singleton(MaskTableRuleConfiguration ("actor", listOf( MaskColumnRuleConfiguration("first_name", "first_name_mask"), ))), mapOf( "first_name_mask" to AlgorithmConfiguration("KEEP_FIRST_N_LAST_M", Properties().apply { setProperty("first-n", "1") setProperty("last-m", "1") setProperty("replace-char", "*") }), ) ) val dataSource = ShardingSphereDataSourceFactory.createDataSource( hikariDataSource, listOf(maskRuleConfiguration), Properties() ) // Query val sql = "SELECT * FROM film_actor\n" + " JOIN actor AS a ON a.actor_id\n" + " JOIN film AS f ON f.film_id\n" + "LIMIT 1" // Query directly (Expected) query(sql, hikariDataSource.connection) // Query with ShardingSphere (Actual) query(sql, dataSource.connection) } fun query(sql: String, connection: Connection) { val statement = connection.createStatement() val resultSet = statement.executeQuery(sql) while (resultSet.next()) { for (i in 1..resultSet.metaData.columnCount) { println("${resultSet.metaData.getColumnName(i)}: ${resultSet.getString(i)} ") } println() } } ``` -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
