I have a SQLDataSource that stores a multiple:true field as JSON. It works fine with numbers, but fails when I use strings with commas - SmartClient always splits/trims values on comma, whether parsing data from client or reading stored values from the database.
Database schema (PostgreSQL):
Data source:
Test cases:
1. Read values are split and mangled when reading from the database
2. Server error when using "," at the end or beginning if value:
Log:
SmartClient version: v13.1p_2025-07-01/PowerEdition Deployment
Database schema (PostgreSQL):
Code:
CREATE TABLE test_json_comma ( id SERIAL PRIMARY KEY, some_values jsonb DEFAULT '[]'::jsonb ); INSERT INTO test_json_comma (some_values) VALUES ('["11,22", "33"]'::jsonb);
Code:
<DataSource ID="testJsonCommaDS" serverType="sql" tableName="test_json_comma"> <fields> <field name="id" type="sequence" hidden="true" primaryKey="true"/> <field name="some_values" type="text" multiple="true" multipleStorage="json"/> </fields> </DataSource>
1. Read values are split and mangled when reading from the database
Code:
> testJsonCommaDS.fetchData({id: 1}, (_, data) => console.log(data[0].some_values)) ["1", "2", "33"] // should have been ["11,22", "33"]
Code:
testJsonCommaDS.addData({some_values:["1,2", "3,"]})
Code:
15:31:43.133 INFO [admin][web-176] com.isomorphic.datasource.DSRequest : Executing testJsonCommaDS.add with criteria: {} values: { some_values:["1,2", "3,"] } 15:31:43.137 INFO [admin][web-176] com.isomorphic.SQL : Executing SQL query on 'X': INSERT INTO test_json_comma (some_values, id) VALUES ('["1,2","3,"]', nextval('test_json_comma_id_seq')) 15:31:43.139 INFO [admin][web-176] com.isomorphic.datasource.DSRequest : Switching cacheSyncTiming to 'immediate' because this is a client 'add' request (dataSource is 'testJsonCommaDS') 15:31:43.139 INFO [admin][web-176] com.isomorphic.SQL : Executing SQL query on 'X': SELECT currval('test_json_comma_id_seq') 15:31:43.140 INFO [admin][web-176] com.isomorphic.datasource.DSRequest : primaryKeys: {id=6} 15:31:43.141 INFO [admin][web-176] com.isomorphic.datasource.DSRequest : Executing testJsonCommaDS.fetch rows: 0->-1 with criteria: {id:6} 15:31:43.147 INFO [admin][web-176] com.isomorphic.SQL : 52: Executing cache sync query on 'X': SELECT test_json_comma.id, test_json_comma.some_values FROM test_json_comma WHERE (test_json_comma.id=6) ORDER BY test_json_comma.id OFFSET 0 LIMIT 1 15:31:43.149 WARN [admin][web-176] com.isomorphic.servlet.RequestContext : dsRequest.execute() failed: java.lang.StringIndexOutOfBoundsException: begin 1, end 0, length 1 at java.base/java.lang.String.checkBoundsBeginEnd(String.java:4606) at java.base/java.lang.String.substring(String.java:2709) at com.isomorphic.datasource.BasicDataSource.convertFromSchemaValue(BasicDataSource.java:4547) at com.isomorphic.datasource.BasicDataSource.transformMultipleFields(BasicDataSource.java:4697) at com.isomorphic.datasource.DataSource.execute(DataSource.java:3368) at com.isomorphic.application.AppBase.executeDefaultDSOperation(AppBase.java:656) at com.isomorphic.application.AppBase.executeAppOperation(AppBase.java:555) at com.isomorphic.application.AppBase.execute(AppBase.java:498) at com.isomorphic.datasource.DSRequest.execute(DSRequest.java:4803) at com.isomorphic.sql.cachesync.SQLRefetchStrategy.getCacheSyncData(SQLRefetchStrategy.java:118) at com.isomorphic.sql.SQLDataSource.SQLExecute(SQLDataSource.java:2204) at com.isomorphic.sql.SQLDataSource.SQLExecute(SQLDataSource.java:1820) at com.isomorphic.sql.SQLDataSource.processRequest(SQLDataSource.java:509) at com.isomorphic.sql.SQLDataSource.executeAdd(SQLDataSource.java:461) at com.isomorphic.datasource.DataSource.execute(DataSource.java:3371) at com.isomorphic.application.AppBase.executeDefaultDSOperation(AppBase.java:656) at com.isomorphic.application.AppBase.executeAppOperation(AppBase.java:555) at com.isomorphic.application.AppBase.execute(AppBase.java:498) at com.isomorphic.datasource.DSRequest.execute(DSRequest.java:4803) at com.isomorphic.servlet.IDACall.handleDSRequest(IDACall.java:255)
Comment